NPM package.json ファイルのdependencies、devDependencies、peerDependenciesの違いは何ですか? 質問する

NPM package.json ファイルのdependencies、devDependencies、peerDependenciesの違いは何ですか? 質問する

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

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

ベストアンサー1

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

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

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

    • フラグを渡さない限り、npm installを含むディレクトリにもインストールされます(アップボートpackage.json--productionガヤン・チャリスの答え)、またはNODE_ENV=production環境変数が設定されている場合
    • npm install "$package"オプションを指定しない限り、他のディレクトリにはインストールされません--dev
    • 推移的にインストールされません。
  • peerDependencies:

    • 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 のテスト依存関係は省略できます。

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

開発依存関係

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/

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

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

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

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

dependency3ファイル内で言及していなくても、このようなことが起こりますpackage.json

これは、制御の反転デザインパターン。

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

例えば、Gruntプラグインではhttps://github.com/gruntjs/grunt-contrib-uglify、次のことがわかります:

  • gruntpeer-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.

おすすめ記事