📦

package.jsonのpeerDependenciesMetaってなんだ?

2022/01/30に公開

TL;TD

  • package.jsonに記述するフィールドで、peerDependencies で定義したバージョンを満たしてなくても警告を出さなくするためのオプションを設定することができる (2020/05/03時点)
  • パッケージを公開する人以外はあんまり気にしなくても大丈夫そう

そもそもpeerDependencies とは

peerDependencies は、あるモジュールXに対するインタフェースを持っており、モジュールXから参照されることを想定するが、モジュールXのどこまでにバージョン互換性を持っているかを表記したものです。

例えば eslint-plugin-vue は、 eslint でVueファイルを扱うためのプラグインですが、どのバージョンの eslint に対して互換性のあるプラグインなのかがpeerDependencies に記述されています。

  "peerDependencies": {
    "eslint": "^5.0.0 || ^6.0.0"
  }

(引用)

上記の例だと、eslint-plugin-vue は、eslintの5系と6系に対応しているということになります。

その互換性をあえて無視して、eslintは4系を、eslint-plugin-vueは最新版を指定してインストールしてみます。すると以下のような、互換性がない旨の警告が出ます。

$ yarn add eslint@4.0.0 eslint-plugin-vue
warning " > eslint-plugin-vue@6.2.2" has incorrect peer dependency "eslint@^5.0.0 || ^6.0.0".

peerDependenciesMeta とは

peerDependenciesMeta は、 peerDependencies の設定に関して、追加情報を定義するためのフィールドで、現在(2020/05/03)は、 optional 属性のみ定義可能なようです。

optional属性はpeerDependenciesの互換性を無視しても良いかをBooleanで設定します。

例えば、もしeslint-plugin-vuepackage.jsonに、以下のようにpeerDependenciesMetaが設定されていると、前項の警告は出なくなります。(※ただし使用するパッケージマネージャによる)

  "peerDependenciesMeta": {
    "eslint": {
      "optional": true
    }
  }

参考

GitHubで編集を提案

Discussion