Madogiwa Blog

主に技術系の学習メモに使っていきます。

Yarn: resolutionsを利用して依存パッケージのバージョンを強制するメモ📝

以前間接的に依存しているパッケージのバージョンを更新する方法としてreinstallするやり方を以下の記事で公開しましたが、

madogiwa0124.hatenablog.com

それでも解消できない場合に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を利用すれば同様なことが行えるようです。

docs.npmjs.com

参考

numb86-tech.hatenablog.com