2016-10-09 10 views
4

ご存じのように、NPM v3では、依存関係ツリーを可能な限りフラットに保つよう試みます。以前は、同じモジュールの複数のバージョンがある場合に、競合を解決するためだけにネストされた依存関係をインストールすると思っていました。NPMモジュールの依存関係を常にネストされたnode_moduleにインストールできるのはなぜですか?

しかし、私はモジュールprotractorについて何か不思議に思っています。それには依存関係があり、webdriver-managerは常にネストされてインストールされ、node_modules/protractor/node_modulesになります。空のフォルダにnpm install protractorを実行すると簡単に再現できます。

どうしてですか?

+0

間で完全な依存性ツリーや紛争のためnpm-remote-ls protractorていますか? – cartant

+0

あなたが正しいと思われるかもしれませんが、詳細を理解したいと思います。それは本当に文書化されていない何かのようです。 – thorn

+0

関連するオープンな[問題](https://github.com/npm/npm/issues/11466)があるため、非平坦化が意図された動作であるかどうかは不明です。知るか? – cartant

答えて

2

これは大きな問題です。現在の動作が期待されます。 npmV3は確かに平坦な構造に依存関係をインストールし、Protractorも同様にインストールされている

分度器をnpmV2.*

enter image description here

すべて一緒にインストールされている場合分度器はnpmV3

enter image description here

でインストールされている場合モジュールはフラット構造にインストールされていますが、まだwebdriver-managerは依然としてネストされた構造です。これは、矛盾する依存関係が原因です。

As per official documentation

あなたの依存関係は現在、最大平坦インストールされます。 が可能な限り、すべての依存関係とその依存関係、およびTHE 依存関係は、ネストされていないプロジェクトのnode_modulesフォルダ にインストールされます。 2つ(またはそれ以上)のモジュールが矛盾する依存関係を持っている場合には、 の下にネストされたモジュールしか表示されません。

それでは、私たちは別のモジュールを必要とするようにしたいとしましょう、C. CはBが必要ですが、A.Howeverより別のバージョンで 、B v1.0のは、すでにトップレベル DEPであることから、我々はB V2をインストールすることはできません.0をトップレベルの依存関係として使用します。この場合、モジュールのC.

webdriver-manager package.jsonリストの依存関係"minimist": "^1.2.0", - NPM v3の はNPM v2の動作をデフォルトと 、それを必要とするモジュールの下に新しい、 異なる、モジュールBバージョンの依存関係を入れ子にすることで、これを処理します競合依存関係によって以下の依存リスト

├─ [email protected] 
    │ ├─ [email protected] 
    │ └─ [email protected] 

を必要と楽観主義のような他のパッケージの競合要件である、webdriver-managerprotractor node_modules

01の内部に設置されています

は、すべての依存関係おそらくそれは `bin`構成でそのモジュールの使用に関連しています

+0

この謎を解いてくれてありがとう。 – thorn

関連する問題