1. ホーム
  2. node.js

[解決済み] npm package.jsonファイルのdependencies, devDependencies, peerDependenciesの違いは何ですか?

2022-03-15 19:42:14

質問

このドキュメント は、私の質問に対して非常に稚拙な回答をしています。私はこれらの説明を理解できませんでした。どなたかもっと簡単な言葉で説明していただけませんか?もし簡単な言葉を選ぶのが難しいのであれば、例を挙げて教えてください。

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

どのように解決するのですか?

重要な動作の違いのまとめ。

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

    • npm install を含むディレクトリから package.json
    • npm install $package 他のディレクトリで
  • devDependencies があります。

    • にもインストールされています。 npm install を含むディレクトリに package.json を渡さない限り --production フラグを立てる(アップボーテに行く ガヤン・チャリス さんの回答 ).
    • にはインストールされません。 npm install "$package" を与えていない限り、他のディレクトリにある --dev オプションで指定します。
    • は過渡的にインストールされない。
  • peerDependencies :

    • 3.0 より前のバージョン: 不足している場合は常にインストールされ、互換性のない複数のバージョンが異なる依存関係によって使用されることになる場合はエラーを発生させます。
    • 3.0での開始を予定 (未検証): で見つからない場合は警告を表示する。 npm install そのため、依存関係を手動で解決する必要があります。実行時に、依存関係が見つからない場合は、エラーになります。 ネクストジェンテック このように説明されています。 https://flaviocopes.com/npm-peer-dependencies/
    • バージョン7で アップストリームの依存関係の衝突が自動的に解決されない限り、peerDependencies は自動的にインストールされます。
  • Transitivity (言及されている ベン・ハッチソン ):

    • 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 というのは、このようなケースはあまりないためです。

ピアデペンデンス

(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とそのプラグインがあります。

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

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

次に、ユーザーがプラグインを使用する場合、暗黙のうちにプラグインを Gruntfile を追加することで grunt.loadNpmTasks('grunt-contrib-uglify') という行がありますが、これは grunt を直接呼び出すことになります。

この場合、各プラグインが異なるバージョンのGruntを必要とする場合、うまくいきません。

マニュアル

多分、あなたはnodeや他のパッケージマネージャに十分な知識がないだけだと思います。私はRubyのbundlerについて少し知っているので、おそらくそれを理解するだけです。

肝心のセリフは。

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

そして、npm-config(7)の下にある dev :

Default: false
Type: Boolean

Install dev-dependencies along with packages.