私は奇妙な問題に遭遇しました-明らかにいくつかのNode.jsモジュールはそうですdeepフォルダー階層そのWindowsコピーコマンド(または、PowerShellのCopy-Item
(実際に使用しているもの)は、パスが250文字を超えると、悪名高い「パスが長すぎます」というエラーになります。
たとえば、これは単一のNodeモジュールが作成できるフォルダー階層です:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
それは非常識に思えますが、Nodeモジュールの現実です。
展開中にコピーと貼り付けを使用する必要があり(Git展開がオプションとなるHerokuのような「賢い」ターゲットプラットフォームは使用していません)、これはWindowsの重大な制限です。
npmコマンドまたはnode_modules
フォルダーを圧縮するもの、または実行時に実際に必要なもののみを含むものはありませんか?(通常、ノードモジュールにはtest
フォルダーなどが含まれます。これを展開する必要はありません。)それを回避する他のアイデアはありますか?残念ながら、Windowsを使用しないことはオプションではありません:)
npm v3(最近リリースされた)は、依存関係を平坦化することでこの問題を解決します。ここで https://github.com/npm/npm/releases/tag/v3.0.flat flat
のリリースノートを確認してください。セクション。
そして、この問題に関する最後のコメント https://github.com/npm/npm/issues/3697
これに追加するために...私が助けたもう一つのことは、インストールされているすべてのモジュールを_npm ls
_でリストすることでした。
モジュールとバージョンのツリーが表示されます...そこから、どのモジュールが重複しているかを簡単に特定できます... _npm dedupe
_は何もしませんでした。それがバグなのか、何なのかわかりません(Node v 10.16)
したがって、重複するモジュールを特定したら、_npm install [email protected] --save-dev
_を使用してルートnode_moduleディレクトリにインストールします。 バージョンは重要です。
その後、node_modulesディレクトリを一掃し、新しい_npm install
_を実行しました。
npm ls
_は、インストールされているすべてのモジュールのリストを取得します。npm install module@version --save-dev
_は、これらのモジュールをルートnode_modulesディレクトリにインストールし、package.jsonを更新します。rmdir node_modules
_はnode_modulesディレクトリを削除します。npm install
_は、依存関係の最新のコピーをプルダウンします。それをやったら、すべてがずっときれいになりました。
また、package.jsonファイルをコメント化して、node_modulesツリーをフラットにするためにどのファイルがダウンしたかを示すことをお勧めします。
あなたの制約を考えれば、素晴らしい解決策はないと思いますが、ここに役立ついくつかのことがあります。
npm dedupe
を使用して、いくつかのパスを短くする可能性のあるディレクトリ階層を最適化してくださいnpm install --production
を使用して、開発ツールなしでインストールしますnode_modules
の下の最上位のyour_project/node_modules/pkg_with_deep_deps
ディレクトリに移動します。これにより、十分に短いパスを使用できますが、引き続き機能します。したがって、これはyour_project/node_modules/pkg_with_deep_deps/node_modules
。になります。require
は実行時にそれらを適切に見つけることができるはずだと思います。手動で変更した内容とその理由を明確に文書化し、package.json
で正確に表現された独自の依存関係を維持する必要があります。これはgithubの問題についての議論です この問題について詳しく説明しています。
ここでは、依存関係を平坦化する「npm-flatten」というノードモジュールを作成しました。 https://www.npmjs.org/package/npm-flatten
Distrubtionを探している場合は、完全なnode.js環境を.NETプロジェクトと統合するNuGetパッケージもここに作成しました。 http://www.nuget.org/packages/NodeEnv/ =
フィードバックを歓迎します。
私を助けたのは、ローカルドライブをNode.jsフォルダーにマップすることでした。
ネット使用n:\ computername\c $\users\myname\documents\node.js/persistent:yes
変更前:c:\ users\myname\documents\node.js\projectname(45文字)変更後:n:\ projectname(14文字で31文字少ない)
多くの場合、これにより一部のモジュールをインストールできました。
すべてのコードをUSBドライブにバックアップしようとしたときに、今日この問題を再発見したと言います。
「C:\ Users\myname\Documents\Node.js\angular-phonecat\node_modules\karma\node_modules\chokidar\node_modules\anymatch\node_modules\micromatch\node_modules\regex-cache\node_modules\benchmarked\node_modules\file-reader\node_modules\extend-shallow\benchmark\fixturesが長すぎます。 "
N:ドライブ文字を使用してそれらをバックアップしようとしても、パスの長さのために失敗する場合がありましたが、上記の文字を修正するのに十分でした。
Microsoft Node.js Guidelines から解決策を見つけました。
> npm install -g rimraf
を超えるファイルを削除max_path
> npm dedupe
重複するパッケージを最上位に移動します> npm install -g flatten-packages
すべてのパッケージを最上位に移動しますが、バージョン管理の問題を引き起こす可能性がありますnpm@3
は、node_modules
フォルダー階層は最大限フラットです。> npm install –g npm-windows-upgrade
1)リリースビルド中、フォルダープロパティを非表示フォルダーとして設定することにより、Visual Studioがこれらのファイル/フォルダーをスキャンしないようにすることができます(node_modulesに設定するだけです) 。参照: http://issues.umbraco.org/issue/U4-6219#comment=67-191
2)次のXMLノードをCsProjectファイルに含めることにより、パッケージ化中に公開されるファイルまたはフォルダーを除外できます。
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
<OutputPath>bin\</OutputPath>
<NoWarn>42016,41999,42017,42018,42019,42032,42036,42020,42021,42022</NoWarn>
<ExcludeFilesFromDeployment>File1.aspx;File2.aspx</ExcludeFilesFromDeployment>
<ExcludeFoldersFromDeployment>Folder1;Folder2</ExcludeFoldersFromDeployment>
</PropertyGroup>
これは適切な解決策ではなく、急いでいるときの回避策ですが、 7-Zip を使用してフォルダーを圧縮し、圧縮されたファイルを移動して問題なく解凍できます。
このソリューションを使用して、クリーンなnpmインストールを実行できないNode.jsアプリケーションをデプロイしました。