このドキュメントは、私の質問への回答が非常に不十分です。私はそれらの説明を理解していませんでした。誰かがもっと簡単な言葉で言うことができますか? 簡単な言葉を選ぶのが難しい場合は、例を挙げてください。
EDITも追加されましpeerDependencies
たが、これは密接に関連しており、混乱を招く可能性があります。
このドキュメントは、私の質問への回答が非常に不十分です。私はそれらの説明を理解していませんでした。誰かがもっと簡単な言葉で言うことができますか? 簡単な言葉を選ぶのが難しい場合は、例を挙げてください。
EDITも追加されましpeerDependencies
たが、これは密接に関連しており、混乱を招く可能性があります。
重要な動作の違いの要約:
dependencies
両方にインストールされています:
npm install
を含むディレクトリからpackage.json
npm install $package
他のディレクトリdevDependencies
それは:
npm install
を含むディレクトリにもインストールされます( Gayan Charithの回答に賛成してください)。package.json
--production
npm install "$package"
オプションを指定しない限り、他のディレクトリにはインストールされません--dev
。npm install
、手動で依存関係を解決する必要があります。実行時に依存関係が見つからない場合、エラーが発生します ( @nextgentechで言及) 。推移性 ( Ben Hutchisonが言及):
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/
ただし、プラグインは通常、このコンテキストではホストと呼ばれる他のパッケージを必要としないパッケージです。その代わり:
たとえば、dependency1
とdependency2
ピアが に依存しているdependency3
場合、プロジェクト ツリーは次のようになります。
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
dependency3
これは、ファイルで言及していなくても発生しpackage.json
ます。
これは、 Inversion of Controlデザイン パターンの例だと思います。
ピアの依存関係の典型的な例は、Grunt、ホスト、およびそのプラグインです。
たとえば、https://github.com/gruntjs/grunt-contrib-uglifyのような Grunt プラグインでは、次のように表示されます。
grunt
ですpeer-dependency
require('grunt')
は下にありtests/
ます:実際にはプログラムによって使用されていません。次に、ユーザーがプラグインを使用するときに、行Gruntfile
を追加してプラグインを暗黙的に要求しますが、それはユーザーが直接呼び出すことです。grunt.loadNpmTasks('grunt-contrib-uglify')
grunt
各プラグインが異なる Grunt バージョンを必要とする場合、これは機能しません。
ドキュメントは質問に非常によく答えていると思います.ノード/他のパッケージマネージャーに精通していないだけかもしれません. Rubyバンドラーについて少し知っているので、おそらくそれを理解しています。
キーラインは次のとおりです。
これらは、パッケージのルートから npm link または npm install を実行するとインストールされ、他の npm 構成パラメーターと同様に管理できます。このトピックの詳細については、npm-config(7) を参照してください。
そして、 npm-config(7) find の下でdev
:
Default: false
Type: Boolean
Install dev-dependencies along with packages.
devDependencies をインストールしたくない場合は、使用できますnpm install --production
例として、mocha は通常 devDependency になります。これは、本番環境ではテストが必要ないためです。一方、express は依存関係になります。
コードから呼び出す関数を提供するライブラリなど、プロジェクトで実行する必要がある依存関係。
これらは推移的にインストールされます (A が B に依存し、C に依存する場合、A に npm install すると B と C がインストールされます)。
例: lodash: プロジェクトはいくつかの lodash 関数を呼び出します。
devDependencies コード
を受け取っ
て JavaScript にコンパイルするコンパイラ、テスト フレームワーク、ドキュメント ジェネレータなど、開発中またはリリース中にのみ必要な依存関係。
それらは推移的にインストールされません (A が B dev-depends に依存している場合、A の npm install は B のみをインストールします)。
例: grunt: プロジェクトは grunt を使用してそれ自体をビルドします。
プロジェクト
が親プロジェクトにフックまたは変更する依存関係。通常は、他のライブラリまたはツールのプラグインです。これは、親プロジェクト (プロジェクトに依存するプロジェクト) が、フックするプロジェクトに依存していることを確認するためのチェックを目的としています。したがって、ライブラリ B に機能を追加するプラグイン C を作成する場合、プロジェクト A を作成する人は、C に依存している場合、B に依存する必要があります。
それらはインストールされません (npm < 3 でない限り)。をチェックしました。
例: grunt: プロジェクトは grunt に機能を追加し、grunt を使用するプロジェクトでのみ使用できます。
このドキュメントでは、ピアの依存関係について非常によく説明しています: https://nodejs.org/en/blog/npm/peer-dependencies/
また、npm ドキュメントは時間の経過とともに改善され、さまざまな種類の依存関係の説明が改善されました: https://github.com/npm/cli/blob/latest/docs/content/configuring-npm/package-json .md#devdependencies
開発にのみ必要で、本番環境では不要なモジュールとパッケージがいくつかあります。ドキュメントにあるように:
誰かがあなたのモジュールをダウンロードして自分のプログラムで使用することを計画している場合、その人はおそらく、あなたが使用する外部テストまたはドキュメント フレームワークをダウンロードしてビルドすることを望んでいないか、その必要はありません。この場合、これらの追加項目を devDependencies ハッシュにリストすることをお勧めします。
依存関係は実行するために必要であり、devDependencies は開発するためにのみ必要です