npm overrides
あるパッケージの依存関係ツリーを上書きできる機能
ユースケース
たとえばパッケージAのバージョンXに脆弱性が発見され、バージョンYで修正されたとき、
プロジェクトが直接パッケージAに依存していたら、単にバージョンYに上げればよい
しかし、パッケージAに依存しているパッケージBがあり、
かつ、脆弱性が修正されたバージョンYが、パッケージBが指定している依存関係(^など)の範囲外になっていてnpm updateで更新できない
ということがある
こういうときに、パッケージBが依存関係を更新してくれるのを待たずに、プロジェクト内で依存関係ツリーを上書きし、脆弱性が修正されたバージョンYを使う、といったことができる
パッケージBが本来意図しているバージョン以外を使うことになるので、機能が動かなくなる可能性がある
パッケージBの依存関係が更新されたとき、overridesを外すのを忘れないようにする必要もある
実例
他のパッケージは^を使っていたので、npm updateで更新できた
さらにgraphql-letは更新が2年前で止まっており、overridesを使うことにした
overridesはそのプロジェクトで使用するパッケージAすべてに適用することもできるし、「あるパッケージAが依存しているパッケージBだけ上書きしたい」ときはJSONのネストで表現する
今回はgraphql-letが依存するminimist、loader-utils、@babel/traverseだけ上書きしたいので、以下のようになる
@babel/coreが@babel/traverseに依存しており、@babel/traverseだけ上げると依存関係が不正になってしまうようなので@babel/coreもバージョンを上げている
念のため@babel/parserも上げたが、やらなくてもよかったかも
code:package.json
"overrides": {
"graphql-let": {
"@babel/core": "^7.23.2",
"@babel/parser": "^7.23.2",
"@babel/traverse": "^7.23.2",
"loader-utils": "^2.0.3",
"minimist": "^1.2.6"
}
このようにした上でnpm update minimistでパッケージを更新すると、overridesで指定したバージョンがインストールされる
npm list <package-name>するとそのパッケージの依存関係が出るので、すべてのパッケージが脆弱性修正済みのバージョンになっていればOK
便利ですね
みなさんpackage.jsonにコメントが書きたくなったときはどうしてるのでしょうか……