web-dev-qa-db-ja.com

node_modules内の入れ子になったnode_modulesを防ぐ方法

私は自分のnpmパッケージを作成しました。それをXYZと呼びます。@material-uiファイルにpackage.json依存関係があります。

プロジェクトAにインストールすると、XYZフォルダー内にnode_modulesがネストされます(つまり、A\node_modules\XYZ\node_modules\@material-ui)。プロジェクトBにインストールすると、node_modulesフォルダーがネストされません。プロジェクトAとBの両方で、同じバージョンの@material-uiファイルにpackage.jsonが含まれています。

XYZパッケージで@material-uiA\node_modulesを使用するように強制するにはどうすればよいですか?

12
Jacoslaw

ネストされたフォルダーが少ないことのメリットと、node_modulesフォルダーに直接含まれるフォルダーが多いことのマイナス面、およびバージョン管理の問題があります。

正しいnpmバージョンを使用する

正しいyarnおよびnpm(つまり:npm v3)には、このような構造の問題はありません。可能な場合は常に構造全体をフラット化する必要があり、バージョンが上位のものと互換性がない場合にのみ、node_modulesがネストされます

バージョンを確認する

したがって、あるプロジェクトで正しく機能し、別のプロジェクトでは機能しない場合は、おそらくバージョンが原因です。 @material-uiが両方で同じバージョンかどうかを確認してください。 2つの異なるパッケージが、ある時点で互いに競合している可能性があります。

それらのインストール方法を確認してください

あなたの質問から、それは同じバージョンだと言っています。ただし、両方のプロジェクトにパッケージをインストールする方法については言及していません。 yarn linkまたはnpm linkを使用してインストールすると、期待どおりに依存関係が適切にインストールされます。

別のパッケージを使用しているかどうかを確認する

パッケージを確認すると、最近material-uiが廃止され、代わりに@material-ui/coreにアップグレードするようにという通知が表示されます。そのフォルダ内の一部のパッケージが同じでない可能性があります。いずれにせよ、依存関係の競合があるときはいつでもこうなります。 @material-uiフォルダ内を確認してください。

手動で平らにする(危険)

この問題を強制的に解決するためのパッケージがいくつかあります。ネストされたnode_modulesフォルダーを経由して、それらを単一のフォルダーにフラット化します。

flatten-packages

  • npm install -g flatten-packagesでインストールします。
  • 実行可能ファイルflatten-packagesを実行して、プロジェクトディレクトリのnode_modulesフォルダーにあるすべてのパッケージを再配置します。
  • Flattenは、古いバージョンのパッケージを削除します。バージョン関連の変更に関連するエラーに注意する必要があります。
13
Md. Abu Taher

これを行うには、npm dedupeコマンドを使用できます。

コマンドをpostinstallスクリプトのpackage.jsonに入れると、NPMがパッケージをインストールするたびに、npm dedupeコマンドが同じバージョンのすべての複製パッケージをフラット化します。

詳細については、 https://docs.npmjs.com/cli/dedupe を参照してください

npm postinstallスクリプト

1
RaynorChan

受け入れられた回答に別の追加があります:

ローカルのnode_modulesフォルダーのキャッシュをクリアする

rm -rf node_modules

取り扱いに注意してください:プロジェクトを新しいnpmモジュールに移行すると、node_modulesフォルダー内で奇妙なキャッシュの問題が発生することがあります。しばらくの間、またはたまたまパッケージの新しいバージョンがルートにインストールされているバージョンとは異なるサブ依存関係にインストールされています。

Package.json依存関係を介して直接依存関係を削除すると、<root>/node_modulesからパッケージが削除されます。これにより、新しいモジュールが依存関係の下にネストされ、期待どおりにルートに移動されないバグが発生する可能性があります。

したがって、ローカルのnode_modulesを一掃することで、クリーンな再インストールを実行し、平坦化を機能させることができます。

0
Cameron

React NPMパッケージを使用したネイティブアプリで同じ問題が発生しました。問題は、プロジェクトAで使用されたReactネイティブのバージョンが(0.59。 5)パッケージで使用されているバージョン(0.59.8)を下回っています。パッケージを最新のプロジェクト(B)にインストールする場合、もちろんReact Nativeの最新バージョンを使用していましたが、それは私のパッケージ(0.59.8)と同じでした。

0
kudo44