peerDependency

[email protected]くらいから、package.jsonにpeerDependencyというキーを見かけるようになった。Plugins - Gruntでも peerDependencyが指定されているプラグインに関しては、Grunt Version ~0.4.0のように出るので意味分かんないけど、とりあえず指定してた。

で、コレ読んだら理解した。

├── [email protected]
└─┬ [email protected]
  └── [email protected]

例えば、こうゆう依存関係の状態があったとき、some-other-libraryのパッケージはrequestパッケージの2.x系で動作しなくても、自身が内包している[email protected]を参照するので特に問題ない。これは現状のdependencyで表現できる。

しかし、パッケージの中にはhostパッケージと呼ばれるものが登場してきた。例えてゆうなら、jQueryとjQueryプラグインのようなもので、あるjQueryプラグインが[email protected]でしか動作しなければ、当然のごとく[email protected]をhost側で読み込んでいたらこのプラグインは動かない。

これはクライアントサイドの話だが、これと同様のことがGruntとそのプラグインの関係にも当てはまる。あるgruntプラグインは[email protected]で動かないけど、[email protected]でhostされていたら動くって場合は、こう表現する。

{
  "name": "grunt-hoge",
  "peerDependencies": {
    "grunt": "0.4.x"
    // "grunt": "~0.4.0"でも同義
  }
}

dependenciespeerとDependencies

今は0.4.xで落ち着いてるからとくに必要のない感じだけど、たぶんこれから0.5.xとかリリースされて0.4.xと混在した時に、peerDependenciesを指定しておくと以下の様なエラー表示してくれる。

npm ERR! peerinvalid The package flatiron does not satisfy its siblings' peerDependencies requirements!
npm ERR! peerinvalid Peer [email protected] wants [email protected]~0.1.9
npm ERR! peerinvalid Peer [email protected] wants [email protected]~0.3.0

ちなみに、peerDependenciesが指定されたgruntプラグインをnpm installするとpeerDependenciesに指定したgrunt(パッケージ)も一緒に落ちてくる。


あ、そうそう、Gruntについては今週土曜のHTML5カンファレンスでも喋るよ。セッションはデザイナーさんとか、はじめてGruntを触るような人向けに喋るからpeerDependenciesとか気になる人は来なくていいよ!魔鎖狩投げたい人はahomuの方に行ってください。でも、人が来ないと寂しいので来てください。でも魔鎖狩こわいので来ないでください。でも来て(ry。。。