このドキュメンテーション は私の質問にはほとんど答えない。私はそれらの説明がわかりませんでした。誰かが簡単な言葉で言うことができますか?単純な言葉を選ぶのが難しい場合は、例を挙げて説明します。
_ edit _ もpeerDependencies
を追加しました。これは密接に関連しており、混乱を招く可能性があります。
重要な動作の違いの要約
dependencies
は両方にインストールされます。
npm install
を含むディレクトリからのpackage.json
npm install $package
devDependencies
は次のとおりです。
npm install
フラグを渡さない限り、package.json
を含むディレクトリの--production
にもインストールされます(up _vote Gayan Charith's answer )。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
(言及された Aidan Feldmanによる )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/ja/blog/npm/peer-dependencies/
通常の依存関係では、依存関係の複数のバージョンを持つことができます。依存関係のnode_modules
内に単純にインストールされます。
例えば。 dependency1
とdependency2
がどちらも異なるバージョンのdependency3
に依存している場合、プロジェクトツリーは次のようになります。
root/node_modules/
|
+- dependency1/node_modules/
| |
| +- dependency3 v1.0/
|
|
+- dependency2/node_modules/
|
+- dependency3 v2.0/
ただし、プラグインは通常他のパッケージを必要としないパッケージです。このパッケージでは Host と呼ばれます。代わりに:
例えば。 dependency1
とdependency2
peerがdependency3
に依存している場合、プロジェクトツリーは次のようになります。
root/node_modules/
|
+- dependency1/
|
+- dependency2/
|
+- dependency3 v1.0/
dependency3
ファイルにpackage.json
が記載されていなくても、これは起こります。
これは Inversion of Control デザインパターンのインスタンスだと思います。
ピアの依存関係の典型的な例は、Grunt、Host、およびそのプラグインです。
たとえば、 https://github.com/gruntjs/grunt-contrib-uglify のようなGruntプラグインでは、次のようになります。
grunt
はpeer-dependency
ですrequire('grunt')
はtests/
の下にあります。実際にはプログラムによって使用されていません。その後、ユーザーがプラグインを使用するときは、grunt.loadNpmTasks('grunt-contrib-uglify')
行を追加して暗黙的にGruntfile
からプラグインを要求しますが、ユーザーが直接呼び出すのはgrunt
です。
各プラグインが異なるGruntバージョンを必要とする場合、これは動作しません。
私はドキュメンテーションが質問に非常によく答えると思います、多分あなたはノード/他のパッケージマネージャに十分に精通していないだけかもしれません。私はRubyバンドラーについて少し知っているので、おそらくそれだけを理解するでしょう。
重要な行は次のとおりです。
これらのものは、パッケージのルートからnpm linkまたはnpm installを実行するときにインストールされ、他のnpm設定パラメータと同様に管理できます。このトピックに関する詳細はnpm-config(7)を参照してください。
そしてnpm-config(7)の下にdev
を見つけます。
Default: false
Type: Boolean
Install dev-dependencies along with packages.
DevDependenciesをインストールしたくない場合は、npm install --production
を使用できます。
一例として、テストは本番環境では必要ないのでmochaは通常devDependencyですが、expressは依存関係です。
パッケージをdevの依存関係として package.json に保存するには:
npm install "$package" --save-dev
npm install
を実行すると、devDependencies
とdependencies
の両方がインストールされます。インストールdevDependencies
を回避するには、次のコマンドを実行します。
npm install --production
依存関係
コードから呼び出す関数を提供するライブラリなど、プロジェクトの実行に必要な依存関係。
これらは推移的にインストールされます(AがBに依存してCに依存する場合、AにnpmをインストールするとBとCがインストールされます)。
例:lodash:プロジェクトはいくつかのlodash関数を呼び出します。
devDependencies
開発中またはリリース中にのみ必要な依存関係。コードを取得してJavascriptにコンパイルするコンパイラ、テストフレームワーク、ドキュメントジェネレータなど。
[。
例:grunt:プロジェクトは自身のビルドにgruntを使用します。
peerDependencies
プロジェクトが親プロジェクトにフックまたは変更する依存関係。通常、他のライブラリまたはツールのプラグインです。これは、親プロジェクト(プロジェクトに依存するプロジェクト)がフック先のプロジェクトに依存していることを確認するためのチェックです。したがって、ライブラリ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/doc/files/package.json .md#devdependencies
開発にのみ必要なモジュールやパッケージがいくつかありますが、本番では必要ありません。 ドキュメンテーション :に書かれているように
誰かがあなたのモジュールをダウンロードして自分のプログラムで使うことを計画しているなら、おそらく彼らはあなたが使う外部テストやドキュメンテーションフレームワークをダウンロードして構築することを望んでいないし、必要としません。この場合、これらの追加項目をdevDependenciesハッシュにリストするのが最善です。
私にとってより明確にした簡単な説明は次のとおりです。
アプリをデプロイするときは、依存関係にあるモジュールをインストールする必要があります。そうしないと、アプリは機能しません。 devDependenciesのモジュールは、あなたがそのマシン上で開発していないので、本番サーバーにインストールする必要はありません。 link
これらの依存関係の説明に対する私の見解を答えに加えたいのですが
dependencies
は、コードベースで直接使用するために使用されます。通常は本番用コードに含まれるもの、またはコードの塊です。devDependencies
はビルドプロセス、エンドコードがどう終わるかを管理するのに役立つツール、サードパーティのテストモジュールに使われます(例:webpackもの)peerDependencies
は、このスニペットを ブログ投稿 トピック 上記のCiro :から読むまで意味がありませんでした。
[plugins]が必要とするのは、プラグインとホストパッケージ間のこれらの「依存関係」を表現する方法です。 「ホストパッケージのバージョン1.2.xに接続した場合にのみ機能するため、互換性のあるホストと一緒にインストールするようにしてください。」この関係をピア依存関係と呼びます。
peerDependencies
はプラグイン用で、機能を実行するために「ホスト」ライブラリを必要とするライブラリですが、一度に記述されている場合がありますbeforeホストの最新バージョンがリリースされました。
つまり、PluginX v1
のHostLibraryX v3
を書いて、立ち去っても、PluginX v1
(またはHostLibraryX v4
)がリリースされたときにHostLibraryX v3.0.1
が機能するという保証はありません。
プラグインの観点から見ると、それはaddsのみがホストライブラリに機能します。プラグインに依存関係を追加するためにホストを実際に「必要」にすることはありません。また、プラグインはしばしばホスト上で文字通りdependしません。ホストがない場合、プラグインは無害に何もしません。
これは、dependencies
が実際にはプラグインの正しい概念ではないことを意味します。
さらに悪いことに、私のホストが依存関係のように扱われた場合、この状況になります 同じブログ投稿の言及 (この回答のホストとプラグインを使用するために少し編集しました):
しかし、[HostLibraryXの最新バージョンをPluginXの依存関係として扱う場合]
npm install
を実行すると、予期しない依存関係グラフが生成されます├── [email protected] └─┬ [email protected] └── [email protected]
メインアプリケーションとは異なる[HostLibraryX] APIを使用するプラグインに起因する微妙な失敗は、想像してみてください。
...それがプラグインのポイントです。ホストが、プラグインのallの依存関係情報を含めるのに十分であれば、それで問題は解決しますが、それは巨大な新しい文化的問題をもたらします:プラグイン管理!
プラグインの全体的なポイントは、匿名でペアリングできることです。完璧な世界では、ホストがそれらをすべて管理することはきちんと整頓されますが、図書館の群れ猫を必要としません。
代わりに、ピアになるという概念があります。ホストもプラグインも、相手の依存関係バケットにありません。両方とも依存グラフの同じレベルに存在します。
私がPluginX v1
かつexpectのピア(つまり、peerDependency of])HostLibraryX v3
である場合、そう言います。最新のHostLibraryX v4
に自動アップグレードした場合(バージョン4に注意してください)およびPlugin v1
がインストールされています。知っておく必要がありますか?
npm
はこの状況を管理できません-
「ねえ、あなたは
PluginX v1
を使用していることがわかります!HostLibraryX
をv4からv3に自動的にダウングレードしていますか?」
...または...
「ねえ、あなたは
PluginX v1
を使用しているのを見る。それはHostLibraryX v3
を期待している。あなたは最後のアップデートでほこりに残った。安全のために、Plugin v1
-を自動的にアンインストールする!! 1!
いいえ、npmはどうですか?!
したがって、npmはそうではありません。状況を警告し、HostLibraryX v4
がPlugin v1
の適切なピアであるかどうかを判断できます。
プラグインの優れたpeerDependency
管理により、この概念は実際にはより直感的に機能します。 ブログ投稿 から、もう一度...
1つのアドバイス:通常の依存関係の要件とは異なり、ピアの依存関係の要件は寛大でなければなりません。特定のパッチバージョンにピアの依存関係をロックしないでください。あるプラグインがChai 1.4.1に依存している一方で、別のプラグインがChai 1.5.0に依存している場合、単に作者が怠け者であり、実際の最小バージョンのChaiと互換性があります。
依存関係と開発者の依存関係
開発依存関係は開発時にのみ必要なモジュールですが、実行時には依存関係が必要です。アプリケーションをデプロイする場合、依存関係をインストールする必要があります。そうしないと、アプリが機能しなくなります。プログラムを実行できるようにするコードから呼び出すライブラリは、依存関係と見なすことができます。
Eg- React、React-dom
コードをjavascriptに変換するマシン.compiler、テストフレームワーク、およびドキュメントジェネレーターは開発中にのみ必要であるため、dev依存モジュールと見なすことができるため、開発サーバーに開発依存モジュールをインストールする必要はありません。
例:ESLint、Babel、webpack
@FYI、
mod-a
dev-dependents:
- mod-b
dependents:
- mod-c
mod-d
dev-dependents:
- mod-e
dependents:
- mod-a
----
npm install mod-d
installed modules:
- mod-d
- mod-a
- mod-c
----
checkout the mod-d code repository
npm install
installed modules:
- mod-a
- mod-c
- mod-e
Npmに公開する場合、正しいモジュールに正しいフラグを使用することが重要です。 npmモジュールが機能する必要がある場合は、「-save」フラグを使用して、モジュールを依存関係として保存します。モジュールが機能する必要はないが、テストには必要な場合は、「-save-dev」フラグを使用します。
# For dependent modules
npm install dependent-module --save
# For dev-dependent modules
npm install development-module --save-dev
Npmパッケージを配布することを試みるときあなたはdependencies
の使用を避けるべきです。代わりにpeerDependencies
に追加するかdependencies
から削除することを検討する必要があります。
要するに
依存関係 - 本番環境でアプリケーションに必要なnpm install <package> save-prod
instalslパッケージ。
DevDependencies - npm install <package> --save-dev
は、ローカルの開発とテストにのみ必要なパッケージをインストールします
npm install
と入力するだけで、package.jsonに記載されているすべてのパッケージがインストールされます。ローカルコンピュータで作業している場合は、npm install
と入力して続行してください。