このドキュメントは、私の質問に非常に不十分に答えています。私はこれらの説明を理解できませんでした。誰かもっと簡単な言葉で言ってくれませんか?簡単な言葉を選ぶのが難しければ、例を挙げて教えてください。
EDIT また、peerDependencies
を追加しました。これは密接に関連していて、混乱の原因になるかもしれません。
重要な動作の違いをまとめました。
npm install
は package.json
を含むディレクトリからインストールする。npm install $package
をインストールした場合--production
フラグを渡さない限り、npm install
で package.json
を含むディレクトリにインストールされます(Gayan Charith の回答 を upvote してください)。で他のディレクトリにインストールされた場合、
--dev` オプションを指定しない限り、インストールされません。peerDependencies
:npm install
で見つからない場合は警告を表示し、手動で依存関係を解決する必要があります。実行時に依存関係がないとエラーになる(@nextgentechが言及)。devDependencies
は過渡的にインストールされません。例えば、AをテストするためにBをテストする必要はありませんので、Bのテスト用の依存関係は省くことができます。
ここでは説明していない関連オプションoptionalDependencies
(言及 by Aidan Feldman)devDependenciesは開発のためだけに必要なもので、例えばユニットテスト、CoffeeScriptからJavaScriptへの変換、minificationなどがあります。 パッケージを開発する場合は、
git cloneなどでダウンロードして、
package.json`があるルートに行き、次のように実行します。
npm install
実際のソースを持っているので、それを開発したいことは明らかです。したがって、デフォルトでは、dependencies
(もちろん、開発するためには実行しなければならないので)とdevDependency
の両方の依存関係もインストールされます。
しかし、あなたが単にパッケージをインストールして使いたいだけのエンドユーザーの場合は、どのディレクトリからでもインストールできます。
npm install "$package"
この場合、通常は開発用の依存パッケージは必要ありませんので、パッケージを使用するために必要なものだけを取得します: dependencies
。
どうしても開発用パッケージをインストールしたい場合は、dev
設定オプションを true
にして、おそらくコマンドラインから次のように入力します。
npm install "$package" --dev
これはあまり一般的ではないケースなので、このオプションはデフォルトでは false
になっています。
(3.0以前でテスト済み)
出典: https://nodejs.org/en/blog/npm/peer-dependencies/
通常の依存関係では、複数のバージョンの依存関係を持つことができます。これは単純に依存関係の node_modules
の中にインストールされます。
例えば、dependency1
と dependency2
が異なるバージョンの dependency3
に依存している場合、プロジェクトツリーは以下のようになります。
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
しかし、プラグインは、通常、もう一方のパッケージを必要としないパッケージです。代わりに
dependency1
と dependency2
が dependency3
に依存している場合、プロジェクトツリーは以下のようになります。root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
これは、package.json
ファイルで dependency3
について言及していないにもかかわらず起こります。
これはInversion of Controlというデザインパターンの一例だと思います。
ピア依存の典型的な例は、ホストであるGruntとそのプラグインです。
例えば、https://github.com/gruntjs/grunt-contrib-uglify のようなGruntプラグインでは、次のように表示されます。
は
ピアディペンデンシー`です。require('grunt')
は tests/
の下にあり、実際にはプログラムで使用されていません。
そして、ユーザーがプラグインを使用する際には、grunt.loadNpmTasks('grunt-contrib-uglify')
の行を追加することで、Gruntfile
からプラグインを暗黙的に要求しますが、ユーザーが直接呼び出すのは grunt
です。
この方法は、各プラグインが異なるGruntのバージョンを必要とする場合には機能しません。ドキュメントは質問によく答えていると思いますが、もしかしたらnodeや他のパッケージマネージャに慣れていないだけかもしれません。私はRubyのbundlerについて少し知っているからこそ理解できたのだと思います。 重要なのは
パッケージのルートからnpm linkやnpm installを行うと、これらのものがインストールされ、他のnpm設定パラメータと同様に管理することができます。詳しくはnpm-config(7)を参照してください。 そして、npm-config(7)で
dev
を探す。
Default: false
Type: Boolean
Install dev-dependencies along with packages.