Node npmwindowsファイルパスが長すぎてパッケージをインストールできません


89

状況

Windowsでホストされている開発環境でgulpと関連するフロントエンドツールチェーンを使用したいと思います。node_modulesフォルダーグラフが扇形に広がり、Windowsファイルパスが長すぎてファイルをコピーできないため、Browser-Syncなどのgulpプラグインを使用しようとして壁にぶつかっています。Nodeコミュニティが将来、Windowsでのnpmの使いやすさを向上させるために何を提供するかどうかに関係なく、現在Windowsでこの問題を処理するための実用的なアプローチが必要です。

2つの質問

  1. 意図したとおりに機能するWindows用のnpmワークフローはありますか?「コマンドを実行してファイルをインストールする」(たとえば、OSXのnpm、Linuxのnpm、ruby gems、さらにはnugetに相当)使用するたびに手動でファイルを編集したり、シンボリックリンクなどをいじったりしたくありません。 Windowsではnpm。

  2. Windows APIファイルのパス制限を回避するためのnpmとノード実行のための十分に文書化された安定したCygwinワークフローはありますか?

以下にリストされているゴーリーの詳細...

一般的な問題

  • 標準のWindowsコマンドプロンプトからnpminstallを実行すると、深くネストされたnode_modules階層で失敗します。
  • Joyentのgithubリポジトリスレッドによると、これは認識されている問題であり、Windows中心の環境の開発者にとっては好ましい回避策はありません。(本当に?
  • NTカーネルは、最大32,767文字のファイルパス長をサポートします。
  • WindowsAPIのMAXPATHは260文字に制限されています。
  • Windows APIは、エクスプローラー、CMD、Powershell、MYSgit bashなどを含まないすべての主要なWindowsシェルのファイル操作を処理します(MSは本当に?NTFSはどのくらいの期間使用されていますか?
  • Cygwinは長いファイルパスをサポートしていますが、crlf形式のため、npm.cmdはそのままでは機能しません。npmでDOS2Unixトランスフォームを試して、Cygwinで動作させましたが、これには他の問題があるようです。

私の現在のハック

  • C:\のルートにステージング領域として「n」フォルダーを作成します。これにより、フォルダーパスが短くなります。
  • 「n」フォルダー内でnpmを実行して、必要なモジュールをインストールします。
  • Cygwinを起動し、cpを使用してnode_modulesフォルダーを宛先プロジェクトにコピーします。
  • 依存関係が変更されたとき、または新しいプロジェクトを起動する必要があるときは、すすいで繰り返します。

その他の不快な回避策

シンボリックリンクを使用してファイルパスを短縮できますが、これらは厄介なハックです。npmエコシステムが成長するにつれて、ネストされた依存関係チェーンが長くなりすぎ、この回避策は使用できなくなります。

ルートフォルダーのpackage.jsonファイルにすべての依存関係を追加することは、私が遭遇した1つのスレッドで言及されました。このアプローチはフォルダー構造をフラットにし、重複するモジュールのロードを防ぎますが、この回避策は不自然に感じます。また、手動またはハッキーなスクリプトを使用して、インストール後にファイルやフォルダーをいじる必要があるため、npmの使いやすさ、耐久性、生産性が低下します。このアプローチは、シンボリックリンクアプローチが最終的に苦しむ可能性があるのと同じ運命に対しても脆弱です。


私はこれを解決したとほとんど思っていました。次の2つのファイルでdos2unixutilを実行することでCygwinをnpmで動作させました:npm.cmdとnpm
Allan McLemore

一部のnpmモジュールはVisualStudioを使用してファイルを作成するため、WindowsAPIパスの制限によりnpmは使用できなくなります。これは、ブラウザ同期をnpmしたときに受け取るエラーです:C:\ Program Files(x86)\ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets(301,5):エラーMS B3491:可能性がありますファイル「Release \ obj \ validation \ validation.tlog \ validation.lastbuildstate」に行を書き込まないでください。指定されたパス、ファイル名、またはその両方が長すぎます。完全修飾ファイル名は260文字未満である必要があり、ディレクトリ名は248文字未満である必要があります。
Allan McLemore 2014年

Windowsにnpmをロードするノードモジュールを取得するための「タフィープル」アプローチがあるかもしれません。これには、npm install、npm dedupe、npm Shrink、およびrm -rnode_modulesのいくつかのラウンドが含まれます。これを繰り返し行うと、長いファイルパスがある程度解決されるように見えますが、タフィーを引っ張るようなものです(たとえば、完了するまで実行されません)。誰かがこれを成文化したり、これをよりターンキーにするための自動化ツールを書いたりしましたか?
Allan McLemore 2014年

「ハッキースクリプト」と言えば、ひどくハッキーだとは思わないものを書きました。インストール後にモジュールのディレクトリ構造をプログラムでフラット化するために使用できるfenestrateというツールを作成しました。グローバルなnpmpostinstallフックとしてインストールできます。
zetlen 2014年

2
@yoneal個人的な使用のために、そしてすぐに始めるために、fenestrateはnode_modulesフォルダーを再帰的にウォークする必要があるため、深い依存関係で手動で実行する必要はありません。ただし、これらの依存関係をフォークするのは素晴らしいことです。単純なfenestrate構成を持つフォークされたモジュールの多くは、npmメンテナーに素晴らしいメッセージを送信すると思います。
zetlen 2014年

回答:


58

Windowsで深くネストされたフォルダーの問題は、npmバージョンからほとんど解決されています3.x

npmによると:

.npm @ 3は、可能な限りすべてをトップレベルのnode_modulesに持ち上げることで、インストールを「最大限にフラット」にします。つまり、ネストは競合時にのみ発生するため、ツリーが非常に深くなることはありません。そのため、Windowsのパスの長さの制限にぶつかってはなりません。

npm3.1.0をインストールして、恐ろしいThe specified path, file name, or both are too longエラーをスローしていたパッケージで試してみました。

問題はなくなりました。

ここから最新のnpmビルドを入手できます:npmリリース


4
また、Windowsマシンでのnpm3.xアップデートでも成功しました。恥知らずなプラグイン:Windowstriplet.fi/blog/でnpm3
Tx3

21

Windows 8.1および10には、Win32パス制限を増やすオプションがあります。

  • グループポリシーエディターを開きます(Windows+Rを押して入力しgpedit.msc、を押しますEnter
  • 次のディレクトリに移動します。 Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • [ Win32ロングパスを有効にする]オプションをダブルクリックして有効にします。

ここに画像の説明を入力してください


オプションは私には利用できませんでした、そしてfwiw、私はwin 7 proからアップグレードしたので、それが考えられる原因です
Evan Morrison 2016

@EvanMorrison「Filesystem \ NTFS \ EnableNTFS long path」は、後のwin10ビルドで「FileSystem \ EnableWin32longpaths」に名前が変更されました。後で参照できるように回答を更新しました。
マルセロメイソン

1
Win Server 2012 R2のアイデア
sairfan 2017

12

これは回避策です。

依存関係をフラット化するノードモジュールがいくつかあります。
リンクはここにあります:

これらのモジュールが行っていることは、手動で行うこともできます。これは、現時点で存在する唯一の実際のソリューションです。つまり、依存関係のプライベートコピーをすべて深くネストするのではなく、すべてのモジュールを単一レベルにし、相互に要求することです。


10
私が見つかりました平ら-のパッケージを十分に文書化し、使いやすいように。
StriplingWarrior 2015

3

アラン-

リンクしたgithubの問題から、

npmは、デフォルトで重複排除をインストール時に追加します。これは、Nodeのモジュールシステムを変更するよりもはるかに実現可能ですが、それでも正確に些細なことではなく、長く定着したパターンの多くのやり直しが必要です。

これは(ついに)現在npmで作業中であり、名前で呼ばれmulti-stage-install、を対象としていnpm@3ます。 npm開発リーダーのForrestNorvellは、新年にWindowsでの実行に時間を費やす予定です。そのため、npm課題追跡システムでWindows関連の課題を作成してください< https://github.com/npm/npm/issues >


3

同じ問題があります。同じ依存モジュールの異なるバージョンに依存するモジュールを使用している可能性があるため、依存関係をフラット化することは完全な解決策ではありません。gulp-runモジュールがフラット化後に動作を停止したことを発見しました(bin / .binディレクトリに関するモジュールの仮定に関連していると思われます)。ドラ!

問題については多くの議論がありますが、解決策は見えません:https//github.com/joyent/node/issues/6960

https://github.com/npm/npm/issues/3697

私にとって有効な回避策は、プロジェクトが明示的に必要としない依存関係を手動で追加することです。

問題を引き起こしているパッケージを特定したい場合は、PathLengthCheckerが非常に役立つことがわかりました。EXEを抽出し、GUIまたはコマンドラインアプリを実行するだけです。私が問題を発見したもう1つの方法は、Visual Studioでビルドしようとすることですが、どのディレクトリ名が長すぎるか通知せずに失敗します。

これが私の回避策のコマンドラインの例です:

mkdir c:\reallylongdirectorywillbreakinwindows
cd c:\reallylongdirectorywillbreakinwindows
npm init
npm install --save-dev grunt-bower-task
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

私は戻りました:

261:C:\ reallylongdirectorywillbreakinwindows \ node_modules \ grunt-bower-task \ node_modules \ bower \ node_modules \ update-notifier \ node_modules \ latest-version \ node_modules \ package-json \ no de_modules \ repository-url \ node_modules \ npmconf \ node_modules \ config-chain \ readme.markdown

[切り取り-12個ありました]

npm lsコマンドによると:

└─┬ grunt-bower-task@0.4.0
  ├── async@0.1.22
  ├─┬ bower@1.3.12
  │ ├─┬ update-notifier@0.2.0
  │ │ ├─┬ latest-version@0.2.0
  │ │ │ └─┬ package-json@0.2.0
  │ │ │   └─┬ registry-url@0.1.1
  │ │ │     └─┬ npmconf@2.1.1
  │ │ │       ├─┬ once@1.3.1
  │ │ │       │ └── wrappy@1.0.1

npmconfを使ってみましょう-問題を引き起こしているすべての長すぎるファイルのコンテナです。npmconf2.1.1が必要です。

npm install --save-dev npmconf@2.1.1
(now delete the node_modules directory - you may have to use Windows Explorer if you can't do it with rmdir /s)
npm install
PathLengthChecker.exe RootDirectory="C:\reallylongdirectorywillbreakinwindows" MinLength=260

結果なし-すべてのファイルが制限内にあります!

ここでの明らかな注意点は、パッケージごとに1回しか機能しないことです。ノードはディレクトリ構造内のバージョンを考慮しないため、同じモジュールの異なるバージョンへの依存関係をルートnode_modulesレベルでインストールすることはできません。

この回避策は完全ではありませんが、Windowsでノードを機能させるという私の主な目標を解決します。解像度はpackage.jsonで正しいため、回避策は他の開発者やビルドサーバーで手動またはグローバルな手間をかけずに機能します。


2

グローバルにインストールしても問題がない場合、これは回避策になる可能性があります。

npmがグローバルモジュールをインストールするパスを、c:\users\\{username}\AppData\Roaming\npm\npm_modulesすでに多くの文字を使用する非常に短いもの(通常は:)に調整できます。

調整するには、こちらを参照してください:Windowsのnode.jsモジュールのデフォルトのグローバルインストールディレクトリを変更しますか?

たとえば、次のように調整するとc:\n\、問題が解決する場合があります。


1

これが最終的に私のためにそれを修正したものです...

gulpをインストールしてエラーを受け取ったら、... gulpを実行します。

パッケージに障害が発生した場合は、を使用して手動でインストールしてください--no-bin-link

sudo npm install {package} --no-bin-link

ここで、{package}は問題が発生しているパッケージです。

このすべての後、プラグイン 'gulp-notify'でエラーが発生しましたメッセージ:見つかりません:notify-send。

これは、Vagrantのプラグインの問題が原因でした。通知をオフにすることができます。

export DISABLE_NOTIFIER=true;

または、Vagrantを使用してプラグインをインストールします。

幸運を祈ります。多くの人々の推薦に従った後でも、私はこれに長い時間を費やしました。

ブランドン


0

Windowsの場合:

  1. Windowsエクスプローラーを使用して、vagrant共有フォルダーに移動します(ちなみに私はscotchboxを使用しています)。 C:\scotchbox/public/gulpProject
  2. フォルダのアドレスバーに入力してcmd、を押しますEnter
  3. gulpインストールを行います npm install

1
同じ回答をコピーして貼り付けることは避けてください。代わりに、重複としてフラグを立てる必要があります。さらに、あなたの投稿で誓わないでください。
ツナキ2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.