このドキュメント私の質問に非常に不十分に答えています。説明が理解できませんでした。誰かもっと簡単な言葉で説明してもらえませんか? 簡単な言葉を選ぶのが難しい場合は、例を挙げて説明してもらえませんか?
またpeerDependencies
、密接に関連しており混乱を招く可能性がある も追加されました。
ベストアンサー1
重要な動作の違いの概要:
dependencies
両方にインストールされています:npm install
ディレクトリからpackage.json
npm install $package
他のディレクトリ
-
- フラグを渡さない限り、
npm install
を含むディレクトリにもインストールされます(アップボートpackage.json
--production
ガヤン・チャリスの答え)、またはNODE_ENV=production
環境変数が設定されている場合 npm install "$package"
オプションを指定しない限り、他のディレクトリにはインストールされません--dev
。- 推移的にインストールされません。
- フラグを渡さない限り、
-
- 3.0 より前: 存在しない場合は常にインストールされ、依存関係の複数の互換性のないバージョンが異なる依存関係によって使用される場合はエラーが発生します。
- 3.0から開始予定(未テスト): が欠落している場合は警告を発し
npm install
、手動で依存関係を解決する必要があります。実行時に依存関係が欠落している場合はエラーが発生します(ネクストジェンテック) これはそれをうまく説明しています:https://flaviocopes.com/npm-peer-dependencies/ - バージョン7自動的に解決できない上流の依存関係の競合が存在しない限り、peerDependenciesは自動的にインストールされます。
推移性(言及されているベン・ハッチソン):
dependencies
推移的にインストールされます。つまり、A が B を必要とし、B が C を必要とする場合は C がインストールされます。そうでない場合は、B は動作せず、A も動作しません。devDependencies
推移的にインストールされません。たとえば、A をテストするために B をテストする必要はないので、B のテスト依存関係は省略できます。
ここで説明されていない関連オプション:
bundledDependencies
これは次の質問について議論されます:npm の通常の依存関係に対する bundledDependencies の利点optionalDependencies
(言及されたエイダン・フェルドマン)
開発依存関係
dependencies
実行のみが必要で、devDependencies
開発のみに必要です。例: ユニット テスト、CoffeeScript から JavaScript へのトランスパイル、縮小など...
パッケージを開発する場合は、パッケージをダウンロードし (たとえば、 経由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/
ただし、プラグインは通常、このコンテキストではホストと呼ばれる他のパッケージを必要としないパッケージです。代わりに、次のようになります。
- プラグインはホストによって要求される
- プラグインはホストが期待する標準インターフェースを提供する
- ホストのみがユーザーによって直接呼び出されるため、ホストのバージョンは 1 つだけである必要があります。
たとえば、dependency1
とdependency2
peer が に依存している場合dependency3
、プロジェクト ツリーは次のようになります。
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
dependency3
ファイル内で言及していなくても、このようなことが起こりますpackage.json
。
これは、制御の反転デザインパターン。
ピア依存関係の典型的な例は、Grunt、ホスト、およびそのプラグインです。
例えば、Gruntプラグインではhttps://github.com/gruntjs/grunt-contrib-uglify、次のことがわかります:
grunt
はpeer-dependency
- 唯一のもの
require('grunt')
は ですtests/
。これは実際にはプログラムによって使用されません。
次に、ユーザーがプラグインを使用する場合、行Gruntfile
を追加することでプラグインを暗黙的に要求しますgrunt.loadNpmTasks('grunt-contrib-uglify')
が、これはgrunt
ユーザーが直接呼び出すものです。
各プラグインに異なる Grunt バージョンが必要な場合、これは機能しません。
マニュアル
ドキュメントには質問に対する答えがかなりよく書かれていると思います。おそらく、あなたは node や他のパッケージ マネージャーに十分精通していないだけでしょう。私がこれを理解できたのは、おそらく Ruby バンドラーについて少し知っているからでしょう。
重要な点は次のとおりです。
これらはパッケージのルートから npm link または npm install を実行するとインストールされ、他の npm 構成パラメータと同様に管理できます。詳細については npm-config(7) を参照してください。
そしてnpm-config(7)の下で以下を見つけますdev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.