web-dev-qa-db-ja.com

ネストされた依存関係をnpm 3に強制的にインストールするにはどうすればよいですか?

私は npm version にアップグレードしましたが、最も大きな変更の1つは フラットな依存関係ツリー を強制することです。

これで、依存関係は最大限にフラットにインストールされます。可能な限り、すべての依存関係とその依存関係、およびそれらの依存関係は、ネストせずにプロジェクトのnode_modulesフォルダーにインストールされます。 2つ(またはそれ以上)のモジュールが競合する依存関係を持っている場合にのみ、モジュールが互いにネストされて表示されます。

したがって、たとえば、パッケージ[〜#〜] a [〜#〜]がパッケージに依存している場合[〜# 〜] b [〜#〜]npm install Aを実行すると、次のファイル構造が得られます。

--- root/
 |--- node_modules/
   |--- A/
   |--- B/

バージョン2以下の古いファイル構造の代わりに:

--- root/
 |--- node_modules/
   |--- A/
     |--- node_modules/
       |--- B/

私が遭遇した最初の(そして私は最後ではないと確信しています)問題はこれでした:

パッケージ[〜#〜] a [〜#〜]はnpm v3の動作を認識せず、パッケージに依存しています[〜#〜] b [〜#〜]。ただし、[〜#〜] a [〜#〜]は、コードにnode_modules/Bがあるため、古い(v2)ファイル構造を想定しています。適切な../node_modules/Bの代わりに。 [〜#〜] a [〜#〜]のコードは、間違ったディレクトリでB/を探しているため、コンパイルされません。 。

開発者にコードの修正を強要し、[〜#〜] a [〜#〜]の更新を待つのが嫌な場合は、 npmを強制的にインストールするオプションを設定する方法があるのだろうか[〜#〜] a [〜#〜]内部の依存関係独自のnode_modulesフォルダ。npmv2が行っていたのと同じ方法。

19
chharvey

やってみました --legacy-bundling ために npm install

https://docs.npmjs.com/cli/install

--legacy-bundling引数を指定すると、npmはパッケージをインストールするため、ノード0.8に含まれているものなど、1.4より前のバージョンのnpmがパッケージをインストールできます。これにより、すべての自動重複除外が排除されます。

23

これは私が十分な睡眠をとらない場合に何が起こるかです。明白な解決策はどういうわけか私を逃れた。

$ cd node_modules/A/
$ npm install
$ cd ../../
3
chharvey

私はこの問題に遭遇し、この問題を修正する代替案を見つけました。 Node.jsにはNPMが付属しているため、私が考えることができる唯一の方法は、Node.js 0.10バージョンにダウングレードすることでした。これには、古い方法で依存関係をインストールするNPMの古いバージョンが付属しています。ダウングレードするために [〜#〜] nvm [〜#〜] を使用し、nvm use 0.10.0を実行しました。このトリックに従うことで、npmバージョンを切り替えることができます。それが役に立てば幸い!

0
Diego