web-dev-qa-db-ja.com

深いnode_modules構造を持つNode.jsアプリケーションをWindowsにデプロイする方法は?

私は奇妙な問題に遭遇しました-明らかにいくつかの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を使用しないことはオプションではありません:)

91
Borek Bernard

npm v3(最近リリースされた)は、依存関係を平坦化することでこの問題を解決します。ここで https://github.com/npm/npm/releases/tag/v3.0.flat flatのリリースノートを確認してください。セクション。

そして、この問題に関する最後のコメント https://github.com/npm/npm/issues/3697

24
RameshVel

これに追加するために...私が助けたもう一つのことは、インストールされているすべてのモジュールを_npm ls_でリストすることでした。

モジュールとバージョンのツリーが表示されます...そこから、どのモジュールが重複しているかを簡単に特定できます... _npm dedupe_は何もしませんでした。それがバグなのか、何なのかわかりません(Node v 10.16)

したがって、重複するモジュールを特定したら、_npm install [email protected] --save-dev_を使用してルートnode_moduleディレクトリにインストールします。 バージョンは重要です。

その後、node_modulesディレクトリを一掃し、新しい_npm install_を実行しました。

短縮版

  1. _npm ls_は、インストールされているすべてのモジュールのリストを取得します。
  2. それらのモジュールを調べて、重複するモジュールを特定します(バージョンは重要です
  3. _npm install module@version --save-dev_は、これらのモジュールをルートnode_modulesディレクトリにインストールし、package.jsonを更新します。
  4. _rmdir node_modules_はnode_modulesディレクトリを削除します。
  5. _npm install_は、依存関係の最新のコピーをプルダウンします。

それをやったら、すべてがずっときれいになりました。

また、package.jsonファイルをコメント化して、node_modulesツリーをフラットにするためにどのファイルがダウンしたかを示すことをお勧めします。

62
Ben Lesh

あなたの制約を考えれば、素晴らしい解決策はないと思いますが、ここに役立ついくつかのことがあります。

  • npm dedupeを使用して、いくつかのパスを短くする可能性のあるディレクトリ階層を最適化してください
  • npm install --productionを使用して、開発ツールなしでインストールします
  • 深くネストされた依存関係(問題を回避するのに十分な程度)をいくつか取り、それらを最上位のnode_modulesディレクトリに移動します。それらを追跡するだけで、どれがあなたの本当の依存関係であり、どれがこの問題の回避策であるかを知ることができます。
  • または、これらの深い依存関係のいくつかを、node_modulesの下の最上位のyour_project/node_modules/pkg_with_deep_depsディレクトリに移動します。これにより、十分に短いパスを使用できますが、引き続き機能します。したがって、これはyour_project/node_modules/pkg_with_deep_deps/node_modules。になります。
    • requireは実行時にそれらを適切に見つけることができるはずだと思います。手動で変更した内容とその理由を明確に文書化し、package.jsonで正確に表現された独自の依存関係を維持する必要があります。

これはgithubの問題についての議論です この問題について詳しく説明しています。

38
Peter Lyons

ここでは、依存関係を平坦化する「npm-flatten」というノードモジュールを作成しました。 https://www.npmjs.org/package/npm-flatten

Distrubtionを探している場合は、完全なnode.js環境を.NETプロジェクトと統合するNuGetパッケージもここに作成しました。 http://www.nuget.org/packages/NodeEnv/ =

フィードバックを歓迎します。

11
user3602171

私を助けたのは、ローカルドライブを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:ドライブ文字を使用してそれらをバックアップしようとしても、パスの長さのために失敗する場合がありましたが、上記の文字を修正するのに十分でした。

1

Microsoft Node.js Guidelines から解決策を見つけました。

  • 短いパスで開始します(例:c:\ src)
  • > npm install -g rimrafを超えるファイルを削除max_path
  • > npm dedupe重複するパッケージを最上位に移動します
  • > npm install -g flatten-packagesすべてのパッケージを最上位に移動しますが、バージョン管理の問題を引き起こす可能性があります
  • へのアップグレード npm@3は、node_modulesフォルダー階層は最大限フラットです。
    • Node v5で出荷
    • または…> npm install –g npm-windows-upgrade
1
zangw

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>
1
David Chelliah

これは適切な解決策ではなく、急いでいるときの回避策ですが、 7-Zip を使用してフォルダーを圧縮し、圧縮されたファイルを移動して問題なく解凍できます。

このソリューションを使用して、クリーンなnpmインストールを実行できないNode.jsアプリケーションをデプロイしました。

0
Jason