npm package.jsonファイルの依存関係、devDependencies、peerDependenciesの違いは何ですか?

2151
Vitalii Korsakov 2013-09-19 04:57.

このドキュメントは私の質問にほとんど答えていません。私はそれらの説明を理解していませんでした。誰かがもっと簡単な言葉で言うことができますか?簡単な言葉を選ぶのが難しい場合は、例を挙げてみませんか?

EDITも追加しましたpeerDependencies。これは密接に関連しており、混乱を招く可能性があります。

14 answers

重要な動作の違いの要約:

  • dependencies 両方にインストールされています:

    • npm install を含むディレクトリから package.json
    • npm install $package 他のディレクトリ
  • devDependencies は:

    • フラグを渡さない限り、npm installを含むディレクトリにもインストールされpackage.jsonます--productionGayan Charithの回答に賛成してください)。
    • オプションnpm install "$package"を指定しない限り、他のディレクトリにはインストールされません--dev
    • 推移的にインストールされません。
  • peerDependencies

    • 3.0より前:依存関係の互換性のない複数のバージョンが異なる依存関係によって使用される場合、欠落している場合は常にインストールされ、エラーが発生します。
    • 3.0から開始する予定(未テスト):が欠落している場合は警告を表示しnpm install、依存関係を手動で解決する必要があります。実行時に依存関係が欠落していると、エラーが発生します(@nextgentechで言及)
  • 推移性(npm package.jsonファイルの依存関係、devDependencies、peerDependenciesの違いは何ですか?言及):

    • dependencies 推移的にインストールされます。AがBを必要とし、BがCを必要とする場合、Cがインストールされます。そうでない場合、Bは機能せず、Aも機能しません。

    • devDependencies推移的にインストールされません。たとえば、AをテストするためにBをテストする必要がないため、Bのテストの依存関係を省略できます。

ここで説明されていない関連オプション:

devDependencies

dependencies実行する必要がありますが、devDependencies開発するためだけです。例:単体テスト、CoffeeScriptからJavaScriptへのトランスパイル、ミニファイ、...

パッケージを開発する場合は、パッケージをダウンロードし(たとえば、経由でgit clone)、を含むルートに移動して、次のコマンドをpackage.json実行します。

npm install

実際のソースがあるので、それを開発したいことは明らかです。したがって、デフォルトではdependencies(もちろん、開発するために実行する必要があるため)、devDependency依存関係もインストールされます。

ただし、パッケージをインストールして使用するだけのエンドユーザーの場合は、任意のディレクトリから実行します。

npm install "$package"

その場合、通常は開発の依存関係は必要ないため、パッケージを使用するために必要なものを取得するだけですdependencies

その場合に本当に開発パッケージをインストールしたい場合は、dev構成オプションをtrueに設定できます。コマンドラインから次のように設定できます。

npm install "$package" --dev

falseこれはあまり一般的ではないため、このオプションはデフォルトです。

peerDependencies

(3.0より前にテスト済み)

ソース:https//nodejs.org/en/blog/npm/peer-dependencies/

通常の依存関係では、依存関係の複数のバージョンを持つことができますnode_modules。依存関係の内部にインストールするだけです。

たとえばdependency1dependency2両方がdependency3異なるバージョンに依存している場合、プロジェクトツリーは次のようになります。

root/node_modules/
                 |
                 +- dependency1/node_modules/
                 |                          |
                 |                          +- dependency3 v1.0/
                 |
                 |
                 +- dependency2/node_modules/
                                            |
                                            +- dependency3 v2.0/

ただし、プラグインは、通常は他のパッケージを必要としないパッケージであり、このコンテキストではホストと呼ばれます。代わりに:

  • ホストにはプラグインが必要です
  • プラグインは、ホストが見つけることを期待する標準インターフェースを提供します
  • ホストのみがユーザーによって直接呼び出されるため、そのバージョンは1つである必要があります。

たとえばdependency1dependency2ピアがに依存しているdependency3場合、プロジェクトツリーは次のようになります。

root/node_modules/
                 |
                 +- dependency1/
                 |
                 +- dependency2/
                 |
                 +- dependency3 v1.0/

これdependency3は、package.jsonファイルで言及していなくても発生します。

これは制御反転のデザインパターンの例だと思います。

ピアの依存関係の典型的な例は、Grunt、ホスト、およびそのプラグインです。

たとえば、https://github.com/gruntjs/grunt-contrib-uglifyのようなGruntプラグインでは、次のように表示されます。

  • gruntpeer-dependency
  • 唯一のrequire('grunt')下にありtests/ます:それは実際にはプログラムによって使用されていません。

次に、ユーザーがプラグインを使用する場合、行をGruntfile追加することで暗黙的にプラグインを要求しますが、ユーザーは直接呼び出します。grunt.loadNpmTasks('grunt-contrib-uglify')grunt

各プラグインが異なるGruntバージョンを必要とする場合、これは機能しません。

マニュアル

ドキュメントは質問に非常によく答えていると思います。ノード/他のパッケージマネージャーに精通しているだけではないかもしれません。Rubyバンドラーについて少し知っているので、おそらくそれを理解するだけです。

重要な行は次のとおりです。

これらは、パッケージのルートからnpmlinkまたはnpminstallを実行するときにインストールされ、他のnpm構成パラメーターと同様に管理できます。このトピックの詳細については、npm-config(7)を参照してください。

そして、npm-config(7)の下で以下を見つけますdev

Default: false
Type: Boolean

Install dev-dependencies along with packages.
516
Gayan Charith 2015-07-06 00:06.

devDependenciesをインストールしたくない場合は、次を使用できます。 npm install --production

123
Dan Kohn 2013-09-19 08:39.

例として、mochaは通常devDependencyです。これは、本番環境ではテストが必要ないためですが、expressは依存関係になります。

79
qwertzguy 2017-09-06 07:27.

依存
関係コードから呼び出す関数を提供するライブラリなど、プロジェクトを実行するために必要な依存関係。
それらは推移的にインストールされます(AがBに依存している場合はCに依存し、Aにnpm installを実行するとBとCがインストールされます)。
例:lodash:プロジェクトはいくつかのlodash関数を呼び出します。

devDependencies
コードを取得して、JavaScript、テストフレームワーク、またはドキュメントジェネレーターにコンパイルするコンパイラーなど、開発中またはリリース中にのみ必要な依存関係。
それらは推移的にインストールされません(AがBに依存している場合dev-Cに依存している場合、Aにnpm installを実行するとBのみがインストールされます)。
例: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

66
Mohammed Safeer 2016-01-08 20:41.

パッケージをdev依存関係としてpackage.jsonに保存するには:

npm install "$package" --save-dev

実行npm installすると、devDependenciesとの両方がインストールされますdependencies。インストールのdevDependencies実行を回避するには:

npm install --production
39
Amberlamps 2013-09-19 04:59.

開発にのみ必要なモジュールやパッケージがいくつかありますが、本番環境では必要ありません。それがドキュメントでそれを言うように:

誰かがプログラムでモジュールをダウンロードして使用することを計画している場合、おそらく、使用する外部テストまたはドキュメントフレームワークをダウンロードして構築することを望まないか、または構築する必要はありません。この場合、これらの追加アイテムをdevDependenciesハッシュにリストするのが最善です。

19
Jyoti Duhan 2017-09-30 05:36.

私にそれをより明確にした簡単な説明は次のとおりです:

アプリをデプロイするときは、依存関係にあるモジュールをインストールする必要があります。そうしないと、アプリは機能しません。devDependenciesのモジュールは、本番サーバーで開発していないため、本番サーバーにインストールする必要はありません。 リンク

15
Sîrbu Nicolae-Cezar 2018-02-17 01:40.

これらの依存関係の説明に関する私の見解を回答に追加したいと思います

  • dependencies コードベースで直接使用するために使用されます。通常は本番コードで使用されるもの、またはコードのチャンクです。
  • devDependencies ビルドプロセス、エンドコードの最終的な管理に役立つツール、サードパーティのテストモジュール(例:webpackのもの)に使用されます。
13
ruffin 2018-08-30 04:47.

peerDependencies上記のCiroに関するブログ投稿からこのスニペットを読むまで、私にはまったく意味がありませんでした。

[プラグイン]に必要なのは、プラグインとそのホストパッケージの間のこれらの「依存関係」を表現する方法です。「ホストパッケージのバージョン1.2.xに接続した場合にのみ機能するので、インストールする場合は、互換性のあるホストと一緒にあることを確認してください。」この関係をピア依存関係と呼びます。

プラグインはホストの特定のバージョンを想定しています...

peerDependenciesプラグイン用であり、機能を実行するために「ホスト」ライブラリを必要とするライブラリですが、ホストの最新バージョンがリリースされる前に作成された可能性があります。

それは私が書いた場合、であるPluginX v1ためHostLibraryX v3と歩いて、保証はありますPluginX v1時に動作しませんHostLibraryX v4(あるいはHostLibraryX v3.0.1解放されます)。

...しかし、プラグインはホストに依存しません...

プラグインの観点からは、ホストライブラリに関数を追加するだけです。プラグインに依存関係を追加するためにホストを実際に「必要」とはしません。プラグインは文字通りホストに依存しないことがよくあります。ホストがない場合、プラグインは無害に何もしません。

これはdependencies、プラグインにとって実際には正しい概念ではないことを意味します。

さらに悪いことに、私のホストが依存関係のように扱われた場合、同じブログ投稿で言及されているこの状況になります(この回答で構成されたホストとプラグインを使用するために少し編集されました):

しかし今、[HostLibraryXの最新バージョンをPluginXの依存関係として扱う場合]実行npm installすると、予期しない依存関係グラフが表示されます。

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

メインアプリケーションとは異なる[HostLibraryX] APIを使用するプラグインに起因する微妙な失敗は、想像に任せます。

...そしてホストは明らかにプラグインに依存していません...

...それがプラグインの要点です。これで、ホストがすべてのプラグインの依存関係情報を含めるのに十分な場合、問題は解決しますが、プラグイン管理という大きな新しい文化的問題も発生します。

プラグインの要点は、匿名でペアリングできることです。完璧な世界では、ホストにすべてを管理させることはきちんと整頓されていますが、図書館に猫の群れを要求することはありません。

階層的に依存していない場合は、おそらく内部依存のピアです...

代わりに、私たちは仲間であるという概念を持っています。ホストもプラグインも、もう一方の依存関係バケットにはありません。どちらも依存関係グラフの同じレベルにあります。


...しかし、これは自動化可能な関係ではありません。<<<マネーボール!!!

私は場合はPluginX v1期待して(、あるのピアのpeerDependencyを持っているがHostLibraryX v3、私はそう言うでしょう。あなたはきた最新の自動アップグレードした場合HostLibraryX v4(ノートのバージョンその4しているPlugin v1インストールされ、あなたは、右知っている必要がありますか?

npm 私のためにこの状況を管理することはできません-

「ねえ、あなたが使っているのがわかりますPluginX v1!私は自動的にHostLibraryXv4からv3にダウングレードしています、kk?」

...または...

「使用してPluginX v1いるようです。HostLibraryX v3前回の更新時にほこりの中に残っていたはずです。安全のため、自動的にアンインストールしますPlugin v1!! 1!

いいえ、npmはどうですか?!

したがって、npmはそうではありません。状況を警告し、HostLibraryX v4がに適したピアであるかどうかを判断できますPlugin v1


コーダ

グッドpeerDependencyプラグインでの管理は、実際には、より直感的にこの概念の作業を行います。ブログ投稿からまたもや...

アドバイスの1つ:ピアの依存関係の要件は、通常の依存関係の要件とは異なり、寛大である必要があります。ピアの依存関係を特定のパッチバージョンに固定しないでください。1つのChaiプラグインがChai1.4.1にピア依存し、別のプラグインがChai 1.5.0に依存している場合、作成者が怠惰で、Chaiの実際の最小バージョンを理解するのに時間を費やさなかったため、非常に煩わしいでしょう。と互換性があります。

11
cherankrish 2019-06-07 19:27.

要するに

  1. 依存関係- npm install <package> --save-prodアプリケーションに必要なパッケージを本番環境にインストールします。

  2. DevDependencies - npm install <package> --save-devインストールパッケージは、ローカルの開発およびテストのために必要

  3. 入力npm installするだけで、package.jsonに記載されているすべてのパッケージがインストールされます

したがって、ローカルコンピュータで作業している場合は、入力npm installして続行してください:)

8
user-needs-help 2020-02-05 04:12.

簡単な説明を見つけました。

短い答え:

依存関係 「...プロジェクトが本番環境で機能するために本当に必要な依存関係です。」

devDependencies 「...開発中に必要なものです。」

peerDependencies 「依存関係として使用できるように独自のライブラリを作成して公開する場合」

この投稿の詳細:https//code-trotter.com/web/dependencies-vs-devdependencies-vs-peerdependencies

6
Selva Ganapathi 2019-07-29 23:50.

依存関係と開発者の依存関係

開発依存関係は、開発中にのみ必要なモジュールですが、依存関係は実行時に必要です。アプリケーションをデプロイする場合は、依存関係をインストールする必要があります。そうしないと、アプリが機能しなくなります。プログラムの実行を可能にするコードから呼び出すライブラリは、依存関係と見なすことができます。

例-React、React-dom

開発依存関係モジュールは、そのマシンで開発する予定がないため、本番サーバーにインストールする必要はありません。コードをjavascriptに変換するコンパイラー、テストフレームワーク、ドキュメントジェネレーターは、開発中にのみ必要になるため、開発依存関係と見なすことができます。

例-ESLint、Babel、webpack

@ご参考までに、

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
0
Melchia 2018-07-07 02:47.

npmパッケージを配布しようとするときは、の使用を避ける必要がありますdependencies。代わりに、に追加するpeerDependenciesか、から削除することを検討する必要がありますdependencies

0
Quantalabs 2020-10-13 12:24.

依存関係

これらはパッケージを実行するために必要なパッケージであるため、ユーザーが実行するとインストールされます

 npm install PACKAGE-NAME

例として、プロジェクトでjqueryを使用した場合があります。誰かがjqueryをインストールしていない場合、それは機能しません。依存関係として保存するには、

 npm install --save

開発依存関係

これらは開発で使用する依存関係ですが、ユーザーが使用している場合は必要npm installありません。したがって、ユーザーが実行する場合、必要がないため、インストールされません。たとえば、mochaを使用してテストする場合、人々はmochaを実行する必要npm installがないため、インストールしません。開発依存として保存するには、

npm install PACKAGE --save-dev

ピアの依存関係

これらは、依存関係として使用できるように独自のライブラリを作成して公開する場合に使用できます。たとえば、パッケージを別のプロジェクトの依存関係として使用したくない場合、プロジェクトを依存関係として持つプロジェクトを誰かがインストールしたときにも、これらがインストールされます。ほとんどの場合、ピア依存関係は使用しません。

Related questions

MORE COOL STUFF

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire は、彼女が息子の Shelby Blackstock と共有する「楽しい」クリスマスの伝統を明らかにしました:「私たちはたくさん笑います」

Reba McEntire が息子の Shelby Blackstock と共有しているクリスマスの伝統について学びましょう。

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルは、自然な髪のスタイリングをめぐってマライア・キャリーと結ばれました

メーガン・マークルとマライア・キャリーが自然な髪の上でどのように結合したかについて、メーガンの「アーキタイプ」ポッドキャストのエピソードで学びましょう.

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子は家族との関係を修復できるという「希望を持っている」:「彼は父親と兄弟を愛している」

ハリー王子が家族、特にチャールズ王とウィリアム王子との関係について望んでいると主張したある情報源を発見してください。

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドは、パニックに陥った休暇の瞬間に、彼女がジャッド家の家長であることを認識しました

ワイノナ・ジャッドが、母親のナオミ・ジャッドが亡くなってから初めての感謝祭のお祝いを主催しているときに、彼女が今では家長であることをどのように認識したかを学びましょう.

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セントヘレナのジェイコブのはしごを登るのは、気弱な人向けではありません

セント ヘレナ島のジェイコブズ ラダーは 699 段の真っ直ぐ上る階段で、頂上に到達すると証明書が発行されるほどの難易度です。

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

バイオニック読書はあなたをより速く読むことができますか?

バイオニック読書はあなたをより速く読むことができますか?

BionicReadingアプリの人気が爆発的に高まっています。しかし、それは本当にあなたを速読術にすることができますか?

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

オーケーグッド770HPランボルギーニセンテナリオは十分に正気ではない

ランボルギーニの創設者であるフェルッチオランボルギーニが100歳になるのは毎日ではありません(そうです、彼は死んでいて、まだ死んでいると思います。

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

彼らが買った1台の車からAppleの車の計画について私たちが推測できること

Appleが自動車分野に参入するという噂はかなり前から渦巻いており、AppleウォッチャーがSixtyEight Researchという会社がAppleの自動車研究開発のシェル会社である可能性が高いと判断したとき、その渦巻きは本当に渦巻いた。また、会社が購入した車は1台だけであることが知られており、その車はAppleが何を考えているかについての手がかりでいっぱいになる可能性があることも伝えています。

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

天文学者は太陽系の9番目の惑星の新しい証拠を見つけます

太陽系の外側にある架空の大きな物体である惑星Xの探索は、何十年にもわたって人間を魅了してきました。その検索の最新の章は、地球の10倍の大きさで、公転周期が15であるほど遠くにある惑星を指しています。

キャムニュートン、ゴッドダム

キャムニュートン、ゴッドダム

カムニュートンは昨日、簡単な265ヤードと3回のタッチダウンでファルコンズを引き裂き、別の素晴らしいゲームをしました。その日のハイライトは、上のタッチダウンスローでした。これは、視聴するたびにばかげているだけです。

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

米国のフィギュア スケートは、チーム イベントでの最終決定の欠如に「苛立ち」、公正な裁定を求める

ロシアのフィギュアスケーター、カミラ・バリエバが関与したドーピング事件が整理されているため、チームは2022年北京冬季オリンピックで獲得したメダルを待っています。

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

Amazonの買い物客は、わずか10ドルのシルクの枕カバーのおかげで、「甘やかされた赤ちゃんのように」眠れると言っています

何千人ものAmazonの買い物客がMulberry Silk Pillowcaseを推奨しており、現在販売中. シルクの枕カバーにはいくつかの色があり、髪を柔らかく肌を透明に保ちます。Amazonで最大46%オフになっている間にシルクの枕カバーを購入してください

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

パデュー大学の教授が覚醒剤を扱った疑いで逮捕され、女性に性的好意を抱かせる

ラファイエット警察署は、「不審な男性が女性に近づいた」という複数の苦情を受けて、12 月にパデュー大学の教授の捜査を開始しました。

コンセプト ドリフト: AI にとって世界の変化は速すぎる

コンセプト ドリフト: AI にとって世界の変化は速すぎる

私たちの周りの世界と同じように、言語は常に変化しています。以前の時代では、言語の変化は数年または数十年にわたって発生していましたが、現在では数日または数時間で変化する可能性があります。

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

犯罪擁護派のオークランドが暴力犯罪者のロミオ・ロレンゾ・パーハムを釈放

SF攻撃で91歳のアジア人女性が殴られ、コンクリートに叩きつけられた

認知症を患っている 91 歳のアジア人女性が最近、47 番街のアウター サンセット地区でロメオ ロレンゾ パーハムに襲われました。伝えられるところによると、被害者はサンフランシスコの通りを歩いていたところ、容疑者に近づき、攻撃を受け、暴行を受けました。

ℝ

“And a river went out of Eden to water the garden, and from thence it was parted and became into four heads” Genesis 2:10. ? The heart is located in the middle of the thoracic cavity, pointing eastward.

メリック・ガーランドはアメリカに失敗しましたか?

バイデン大統領の任期の半分以上です。メリック・ガーランドは何を待っていますか?

メリック・ガーランドはアメリカに失敗しましたか?

人々にチャンスを与えることは、人生で少し遅すぎると私は信じています。寛大に。

Language