依存パッケージの脆弱性修正には、package.jsonのoverrides / resolutionsフィールドを使いましょう

はじめに

この記事は、npmとyarnの依存関係ツリーを上書きするoverrides / resolutionsフィールドの使い方を共有するためのものです。

想定する環境

  • node.js 16.17.1
  • npm 8.15.0
  • yarn v1.22.19
overridesフィールドは、npm v8.3.0で導入されました。それ以前のバージョンでは動作しません。
この記事はyarn v1系統を対象としています。yarn v2+では挙動が変わるかもしれません。各自でご確認ください。

依存関係ツリーを上書きして脆弱性に対応する

依存パッケージが以下のような状態だと、セキュリティ更新に追従するのが難しくなります。

  • 脆弱性を持ったパッケージに依存している
  • メンテナーが不在で更新がない

そこで導入された機能がpackage.jsonのoverrides / resolutionsフィールドです。

npmの場合

package.json | npm Docs
https://docs.npmjs.com

overridesフィールドは、依存パッケージ内のバージョンを固定します。

以下の場合、依存パッケージ内のfooパッケージはすべて1.0.0に固定されます。

▼package.json

{
  "overrides": {
    "foo": "1.0.0"
  }
}

特定のパッケージ内の依存パッケージのみを上書きすることもできます。

▼package.json

{
  "overrides": {
    "foo": {
      ".": "1.0.0",
      "bar": "1.0.0"
    }
  }
}

特定の依存パッケージ内だけバージョンを固定する場合、overridesフィールドをネストします。この例の場合.は自分自身を指し、fooは1.0.0に固定されます。また、fooから参照されるbarも1.0.0に固定されます。

yarnの場合

yarnの場合resolutionsフィールドで依存関係ツリーのバージョンを上書きします。

Yarn
https://classic.yarnpkg.com

▼package.json

{
  "resolutions": {
    "d2/left-pad": "1.1.1",
    "c/**/left-pad": "^1.1.2"
  }
}

resolutionsフィールドとoverridesフィールドの違いは、特定の依存パッケージ内のバージョンの指定方法です。overridesフィールドはパッケージ情報を階層化しますが、resolutionsではキーをGlobで記述します。

Manifest fields
https://yarnpkg.com

なお、v2以降の公式ドキュメントはこちらです。v2以降のyarnをご利用中の方は、こちらもあわせてご確認ください。

以上、ありがとうございました。