web-dev-qa-db-ja.com

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

状況

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コマンドプロンプトからnpm installを実行すると、深くネストされたnode_modules階層で失敗します。
  • Joyentのgithubリポジトリスレッドごと これは確認されている問題です Windows中心の環境の開発者にとって好ましい回避策はありません。 (本当に?
  • NTカーネルは、32,767文字までのファイルパス長をサポートしています。
  • Windows APIのMAXPATHは260文字に制限されています。
  • Windows APIは、エクスプローラー、CMD、Powershell、MYSgit bashなどを含む、すべての主要なWindowsシェルのファイル操作を処理します(MSは本当に?NTFSはどれくらいの期間でしたか?
  • Cygwinは長いファイルパスをサポートしますが、nlf.cmdはcrlfのフォーマット設定によりすぐに動作しません。 Cygwinで動作するようにnpmでDOS2Unix変換を試しましたが、これには他の問題があるようです。

現在のハック

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

その他の好ましくない回避策

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

ルートフォルダーのpackage.jsonファイルへのすべての依存関係の追加は、私が出会った1つのスレッドで言及されました。手動またはいくつかのハッキングスクリプトを使用して、インストール後のファイルとフォルダーをいじる必要があるため、npmの耐久性と生産性。シンボリックリンクアプローチが最終的に被る可能性があるのと同じ運命に対して脆弱です。

87
Allan McLemore

Windowsの深くネストされたフォルダーの問題は、npmバージョン3.x以降でほとんど解決されました。

Npmによると:

.npm @ 3は、最上位のnode_modulesにすべてを巻き上げることにより、インストールを「最大限にフラット」にします。これは、ネストが競合でのみ発生することを意味します。したがって、ツリーは決して深くなることはありません。そのため、Windowsのパスの長さの制限に直面してはなりません。

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

問題はなくなりました。

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

55
biofractal

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

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

enter image description here

20
Marcelo Mason

これは回避策です。

依存関係を平坦化するノードモジュールがいくつかあります。
リンクは次のとおりです。

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

12
Amol M Kulkarni

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

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

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

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

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

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

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\registry-url\node_modules\npmconf\node_modules\config-chain\readme.markdown

[スニップ-12個ありました]

npm lsコマンドによると:

└─┬ [email protected]
  ├── [email protected]
  ├─┬ [email protected]
  │ ├─┬ [email protected]
  │ │ ├─┬ [email protected]
  │ │ │ └─┬ [email protected]
  │ │ │   └─┬ [email protected]
  │ │ │     └─┬ [email protected]
  │ │ │       ├─┬ [email protected]
  │ │ │       │ └── [email protected]

Npmconfを使ってみましょう-問題の原因となっているすべての長すぎるファイルのコンテナです。 npmconf 2.1.1が必要です。

npm install --save-dev [email protected]
(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で正しいため、この回避策は他の開発者や手動またはグローバルな混乱なしにサーバーを構築します。

3
Stefan Mohr

アラン-

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

npmはデフォルトでdedupe-at-install-timeを追加します。これはNodeのモジュールシステムを変更するよりも大幅に実行可能ですが、それでもまだそれほど簡単ではなく、いくつかの長いパターンを再加工する必要があります。

これは現在(最終的に)npmで作業中であり、multi-stage-installという名前であり、npm@3を対象としています。 npm開発リーダーForrest Norvellは、新しい年にWindowsでの実行に時間を費やす予定です。そのため、npm課題トラッカーでWindows関連の課題を作成してください< https:// github .com/npm/npm/issues >

3
Sam Mikes

グローバルにインストールすることに問題がない場合、これは回避策です。

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

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

場合によっては、c:\ n \などに調整すると、問題が解決する場合があります。

2
gwildu

Windowsの場合:

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

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

Gulpをインストールしてエラーを受け取った後、実行... gulp

パッケージの失敗を確認したら、--no-bin-linkを使用して手動でインストールします。

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

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

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

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

export DISABLE_NOTIFIER=true;

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

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

ブランドン

0
user3310182

npm install --no-bin-link全体がフラット化されていますnode_modules

0
kenberkeley