7

私のプロジェクトは angular2 beta.6 に依存しており、別のプロジェクトは angular2 beta.0 に依存しています。

私のプロジェクトのpackage.json

"dependencies": {
    "angular2": "2.0.0-beta.6",
    "another-project": "0.0.1"
}

another-project の package.json

"dependencies": {
    "angular2": "2.0.0-beta.0",
}

私のプロジェクトでは、 2回npm installインストールされます。angular2

  1. node_modules/angular2(ベータ6)
  2. node_modules/another-project/angular2(ベータ 0)

npm3 が angular2 beta.0 をネストする方法を理解しようとしています。どちらも angular2 と呼ばれているため、両方とも最上位に配置できないためですか?

4

3 に答える 3

3

npm3 が angular2 beta.0 をネストする方法を理解しようとしています。どちらも angular2 と呼ばれているため、両方とも最上位に配置できないためですか?

はい、これは正しいです。ノードコードrequireは、次のようなコードを使用して、名前でモジュールを指定します。

require('angular2');

ノード自体はさまざまなバージョンを認識していません。これは の仕事ですnpm。したがって、一致するディレクトリ名に依存して、require パスで最初に一致するモジュールを使用するだけです。

npm競合が発生したときに各モジュールのディレクトリに特定のバージョンをインストールすることでこれに対応し、require パスに最初にそれが含まれるようにします。

于 2016-02-14T19:58:29.197 に答える
3

はい、のせいですbeta.0。グローバル レベルで angular2 の別のバージョンが見つかったためnpm、それをローカルにインストールします。

npm3より高いレベルに他のバージョンの依存関係がない場合にのみ、グローバルに依存関係をインストールします。

ここに私が見つけた小さな例があります:

  • [node_modules]
    • 依存 A v1.0
    • dep B v1.0
      • 依存 A v1.0(ルートバージョンを使用)
    • dep C v1.0
      • dep A v2.0 (このバージョンはルート バージョンとは異なるため、ネストされたインストールになります)
于 2016-02-14T20:04:46.323 に答える
1

フラットな依存関係は npm v3 で導入されました。ドキュメントはhttps://docs.npmjs.com/how-npm-works/npm3にあります。

ドキュメントから質問に答えるには

ただし、B v1.0 は既に最上位の dep であるため、最上位の依存関係として B v2.0 をインストールすることはできません。npm v3 は、デフォルトで npm v2 の動作に設定し、新しい異なるモジュール B バージョンの依存関係をそれを必要とするモジュール (この場合はモジュール C) の下にネストすることでこれを処理します。

したがって、順序が重要です。最初にインストールしたモジュールは、最上位に依存します。後続のモジュールには、ネストされた依存関係があります。

npm dedupeネストされたモジュールの依存関係が最上位に存在する場合は、実行してそれらを削除できます。

于 2017-06-21T23:18:00.983 に答える