2515

このドキュメントは、私の質問への回答が非常に不十分です。私はそれらの説明を理解していませんでした。誰かがもっと簡単な言葉で言うことができますか? 簡単な言葉を選ぶのが難しい場合は、例を挙げてください。

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

4

16 に答える 16

2851

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

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

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

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

    • 3.0 より前: 欠落している場合は常にインストールされ、依存関係の複数の互換性のないバージョンが異なる依存関係によって使用される場合、エラーが発生します。
    • 3.0 で開始する予定です (未テスト): が欠落している場合は警告が表示されnpm install、手動で依存関係を解決する必要があります。実行時に依存関係が見つからない場合、エラーが発生します ( @nextgentechで言及)
    • バージョン 7では、自動的に解決できない上流の依存関係の競合が存在しない限り、peerDependencies は自動的にインストールされます。
  • 推移性 ( Ben Hutchisonが言及):

    • dependenciesA が 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これはあまり一般的ではないため、このオプションはデフォルトです。

ピア依存関係

(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/

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

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

たとえば、dependency1dependency2ピアが に依存している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.
于 2014-02-25T04:25:31.627 に答える
589

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

于 2015-07-05T10:06:35.143 に答える
141

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

于 2013-09-18T18:39:54.463 に答える
122


コードから呼び出す関数を提供するライブラリなど、プロジェクトで実行する必要がある依存関係。
これらは推移的にインストールされます (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

于 2017-09-05T17:27:44.723 に答える
44

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

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

于 2013-09-18T14:59:46.953 に答える
0

依存関係は実行するために必要であり、devDependencies は開発するためにのみ必要です

于 2022-02-17T07:02:41.473 に答える