以前間接的に依存しているパッケージのバージョンを更新する方法としてreinstallするやり方を以下の記事で公開しましたが、
それでも解消できない場合にresolutions
というYarnの機能を使うとinstallするpackageのバージョンを強制出来ることが分かったのでメモ📝
Selective dependency resolutions | Yarn
resolutions
の使い方
例えば以下のような状態でchokidar
のバージョンを3.5.3
に統一したいとします。
$ yarn list --pattern chokidar yarn list v1.22.19 ├─ chokidar@3.5.3 └─ watchpack-chokidar2@2.0.1 └─ chokidar@2.1.8 ✨ Done in 0.10s.
単純なreinstallだと以下のような形で依存ライブラリのバージョンが指定されているとメジャーバージョンの更新が行えずv3系にバージョンを更新できません
watchpack-chokidar2@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== dependencies: chokidar "^2.1.8"
このような時にはresolutions
を使うとバージョン指定を強制できます。
package.json
に以下のように追加してyarn installすると、
"resolutions": { "chokidar": "^3.5.3" }
yarn.lock
が以下のように更新されてchokidar@^2.1.8, chokidar@^3.4.1, chokidar@^3.5.3``の指定でも
chokidar`のv3系が利用されるようになります!
chokidar@^2.1.8, chokidar@^3.4.1, chokidar@^3.5.3: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== dependencies: anymatch "~3.1.2" braces "~3.0.2" glob-parent "~5.1.2" is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" readdirp "~3.6.0" optionalDependencies: fsevents "~2.3.2"
⚠ ただし、あくまで依存関係を無視してinstallしているため想定外の挙動になる可能性があることは留意が必要です。
npmでのやり方
npmでもoverrides
を利用すれば同様なことが行えるようです。