私は自分の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-ui
のA\node_modules
を使用するように強制するにはどうすればよいですか?
ネストされたフォルダーが少ないことのメリットと、node_modulesフォルダーに直接含まれるフォルダーが多いことのマイナス面、およびバージョン管理の問題があります。
正しい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フォルダーにあるすべてのパッケージを再配置します。これを行うには、npm dedupe
コマンドを使用できます。
コマンドをpostinstall
スクリプトのpackage.json
に入れると、NPMがパッケージをインストールするたびに、npm dedupe
コマンドが同じバージョンのすべての複製パッケージをフラット化します。
詳細については、 https://docs.npmjs.com/cli/dedupe を参照してください
受け入れられた回答に別の追加があります:
rm -rf node_modules
取り扱いに注意してください:プロジェクトを新しいnpmモジュールに移行すると、node_modules
フォルダー内で奇妙なキャッシュの問題が発生することがあります。しばらくの間、またはたまたまパッケージの新しいバージョンがルートにインストールされているバージョンとは異なるサブ依存関係にインストールされています。
Package.json依存関係を介して直接依存関係を削除すると、<root>/node_modules
からパッケージが削除されます。これにより、新しいモジュールが依存関係の下にネストされ、期待どおりにルートに移動されないバグが発生する可能性があります。
したがって、ローカルのnode_modulesを一掃することで、クリーンな再インストールを実行し、平坦化を機能させることができます。
React NPMパッケージを使用したネイティブアプリで同じ問題が発生しました。問題は、プロジェクトAで使用されたReactネイティブのバージョンが(0.59。 5)パッケージで使用されているバージョン(0.59.8)を下回っています。パッケージを最新のプロジェクト(B)にインストールする場合、もちろんReact Nativeの最新バージョンを使用していましたが、それは私のパッケージ(0.59.8)と同じでした。