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


91

私は奇妙な問題に遭遇しました-明らかにいくつかのNode.jsモジュールには深いフォルダー階層がありCopy-Item、パスが250を超えるとWindowsのコピーコマンド(または実際に使用しているPowerShellのコマンド)が悪名高い「パスが長すぎる」エラーを発生させます長い文字。

たとえば、これは単一の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での深刻な制限です。

node_modulesフォルダーを圧縮する、または実行時に実際に必要なものだけを含めるnpmコマンドや何かはありませんか?(ノードモジュールには通常、test展開する必要のないフォルダーなどが含まれています。)それを回避する方法に関する他のアイデアはありますか?Windowsを使用しないのは残念ながら選択肢ではありません:)


1
あなたのプロジェクトにはpackage.jsonwith dependenciesセットがありますか?もしそうなら、あなたはせずにコピーできますnode_modulesへのNPMおよび使用installまたはupdate依存関係?
Jonathan Lonowski

4
@JonathanLonowski私たちのデプロイメント環境はnpm installターゲット環境での実行をサポートしていません。ローカルで「デプロイメントパッケージ」(基本的にはZIPとメタデータ)を作成し、ターゲットマシンにアップロードしてそこに抽出することで機能します。したがって、node_modules直接含める必要があります。
Borek Bernard

回答:


24

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

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


5
のリリースノートflat flatは別のページに埋め込まれています。ここに直接リンクがあります:github.com/npm/npm/releases/tag/v3.0.0
John-Philip

@ John-Philipに感謝します。新しいリンクで回答を更新しました
RameshVel

62

これに追加するだけです...インストールされたすべてのモジュールをで一覧表示することも私を助けましたnpm ls

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

したがって、重複するモジュールを特定したら、を使用してそれをルートのnode_moduleディレクトリにインストールしnpm install dupemodule@1.2.3 --save-devます。バージョンは重要です。

その後、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ツリーをフラット化するためにどのファイルがダウンしたかを示すことをお勧めします。


これは私にとってはうまくいきました。ありがとうございました!私の無知を許してください、しかしなぜモジュールが常にトップレベルにインストールされないのですか?
Caleb 2013年

2
@Calebおそらく異なるモジュールは、同じモジュールの異なるバージョンに依存している、またはそれだけで、必要なのは何でも取得することが容易になります多分理由だけであるため、その後の要因、それをダウン...私は知りません。
Ben Lesh 2013年

7
とにかく、先端をありがとう。私のプロジェクトから約1700の重複ファイルを吹き飛ばしました。物事を削除することは、開発者である私のお気に入りの部分です!また、package.jsonにコメントを追加する方法を検討している人のための答えは次のとおりです。stackoverflow.com
14221579

github.com/joyent/node/issues/6960 ノードの男は、Windowsは一流の市民だと言っています。彼らは言った。しかし、彼らは問題を閉じ、何も修正しませんでした。幸運なWindowsユーザー。
2014年

38

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

  • を使用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の問題の議論です。


dedupe(まったく知らなかった)と--productionnpm install -hこのオプションを表示しなかった)を指摘してくれてありがとう!残念ながら、ZIPアーカイブを使用することはできません。上記のコメントを参照してください。
Borek Bernard

9
npm重複排除は、「共通」モジュールを階層内の最も低い共通の場所にフラット化するだけです。十分じゃない。適切な解決策では、階層全体を「強制的にフラット」にし、test / docディレクトリを無視することもできます。別の方法は、ノードがtarファイルから直接モジュールを読み取ることをサポートすることです。
MMind

3
確かに、パッケージのある種の「バイナリ」配布(ZIP、tarballなど)は非常に便利でしょう。
Borek Bernard

11

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

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

フィードバックをお待ちしています。


これでうまくいきました。最初にnmp dedupを実行すると、さらに良い結果が得られました。
Shaun Rowan

1

私を助けたのは、ローカルドライブをNode.jsフォルダーにマップすることでした。

net use 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

1)リリースビルド中に、フォルダーのプロパティを非表示フォルダーとして設定することで、Visual Studioがこれらのファイル/フォルダーをスキャンするのを防ぐことができます(node_modulesに設定するだけです)。リファレンス:http : //issues.umbraco.org/issue/U4-6219#comment=67-19103

2)CsProjectファイルに次のXMLノードを含めることにより、パッケージング中に公開されたファイルまたはフォルダーを除外できます。

<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

Microsoft Node.js Guidelinesから1つの解決策が見つかりました。

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

0

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

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


うん。これは、mongooseをインストールする必要があるたびに行うことです。ネイティブコードが含まれており、Visual Studioの複数のバージョンまたは新しいバージョンを持っています=失敗します。VSを開いて、失敗した各.slnファイルを取り込み、再構築することができます。しかし、必要に応じてnode_modules \ mongooseフォルダーセット全体をXCOPYするだけで簡単です(もちろん、バージョンを監視しています)。
マイケルブランケンシップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.