resolutions で依存の依存のバージョンを指定する

例えば自分はnode@^10を使っていて、これを使いたいのに直接的な依存ではないパッケージのpackage.jsonenginesnode@<1010より小さい)と指定されているが為にyarnでのインストールが失敗するということが起こる時があります。

このエラーは一応yarn --ignore-enginesと、依存のenginesの指定を無視するオプションを付けると回避できますが、色んなプロジェクトを行き来していたりで「このプロジェクトではこのオプションが必要」などと覚えるのは面倒だったりするのでできれば解決したかったりします。

upath

僕が最近目撃したのはupath@1.0.4というパッケージ関連の事です。このupath@1.0.4ではengines>=4 <=9と指定されているようで、既にほかプロジェクトでは1011を使っていたので結構な頻度で引っかかりイライラしていました。

error upath@1.0.4: The engine "node" is incompatible with this module.
Expected version ">=4 <=9". Got "11.13.0"

しかもこれは直接追加したパッケージではなく、あるパッケージの依存パッケージの中で入っているであろうパッケージでいした。

しかし、そのあとにリリースされたこのパッケージのnodeensinesnode>=4へ修正されたので、そちらを使うようにすれば解決できそうです。

resolutions

yarn - 選択的な依存関係の解決

これをpackage.jsonresolutionsへ設定することで直接的な依存関係は弄らずにupathだけのバージョンを上げることができます。

現在のupathの最新バージョンは1.1.2です。upath@1.1.2を使うようにするためには以下のようにします。

{
  "resolutions": {
    "upath": "1.1.2"
  }
}

そしてyarnするだけです。yarnyarn.lockは以下のように更新されていました。

-upath@^1.0.0:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.4.tgz#ee2321ba0a786c50973db043a50b7bcba822361d"
-  integrity sha512-d4SJySNBXDaQp+DPrziv3xGS6w3d2Xt69FijJr86zMPBy23JEloMCEOUBBzuN7xCtjLCnmB9tI/z7SBCahHBOw==
+upath@1.1.2, upath@^1.0.0:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.2.tgz#3db658600edaeeccbe6db5e684d67ee8c2acd068"
+  integrity sha512-kXpym8n

一応他のバージョンは、

  • node@11.13.0
  • yarn@1.15.2

となっています。