状況
Windowsがホストする開発環境で、gulpおよび関連するフロントエンドツールチェーンを使用したい。 node_modulesフォルダーグラフがWindowsファイルパスを長くしてファイルをコピーできないため、Browser-Syncなどのgulpプラグインを使用しようとして壁にぶつかっています。 Nodeコミュニティが将来のWindowsでのnpmの使いやすさを向上させるために提供するかどうかに関係なく、この問題をWindowsで今すぐに処理するための実用的なアプローチが欲しいです。
2つの質問
意図したとおりに機能するWindows用のnpmワークフローはありますか? 「コマンドを実行し、ファイルをインストールします」(たとえば、OSXのnpm、Linuxのnpm、Ruby gems、またはnugetに相当)手動のファイル編集、シンボリックリンク、など。Windowsでnpmを使用するたびに。
Windows APIファイルパスの制限を回避するための、npmおよびノードの実行に関する、十分に文書化された安定したCygwinワークフローはありますか?
以下に記載されている詳細は...
一般的な問題
現在のハック
その他の好ましくない回避策
シンボリックリンクはファイルパスを短縮するために使用できますが、これらは巧妙なハックです。npmエコシステムが成長するにつれて、ネストされた依存関係チェーンが長くなりすぎ、この回避策は使用できなくなります。
ルートフォルダーのpackage.jsonファイルへのすべての依存関係の追加は、私が出会った1つのスレッドで言及されました。手動またはいくつかのハッキングスクリプトを使用して、インストール後のファイルとフォルダーをいじる必要があるため、npmの耐久性と生産性。シンボリックリンクアプローチが最終的に被る可能性があるのと同じ運命に対して脆弱です。
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リリース
これは回避策です。
依存関係を平坦化するノードモジュールがいくつかあります。
リンクは次のとおりです。
これらのモジュールが実行していることは、手動でも実行できます。これは、現時点で唯一の実際のソリューションです。つまり、依存関係のプライベートコピーがすべて深くネストされているのではなく、すべてのモジュールを単一レベルで相互に要求する必要があります。
同じ問題があります。同じ依存モジュールの異なるバージョンに依存するモジュールを使用している可能性があるため、依存関係をフラット化することは完全なソリューションではありません。平坦化後に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で正しいため、この回避策は他の開発者や手動またはグローバルな混乱なしにサーバーを構築します。
アラン-
リンクした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 >
グローバルにインストールすることに問題がない場合、これは回避策です。
Npmがグローバルモジュールをインストールするパスを非常に短いものに調整できます(通常はc:\ users\{username}\AppData\Roaming\npm\npm_modulesです)。
調整するには、こちらを参照してください: Windowsのnode.jsモジュールのデフォルトのグローバルインストールディレクトリを変更しますか?
場合によっては、c:\ n \などに調整すると、問題が解決する場合があります。
Windowsの場合:
C:\scotchbox/public/gulpProject
cmd
」と入力して押します Enternpm install
これは最終的に私のためにそれを修正したものです...
Gulpをインストールしてエラーを受け取った後、実行... gulp
パッケージの失敗を確認したら、--no-bin-link
を使用して手動でインストールします。
Sudo npm install {package} --no-bin-link
{package}は問題が発生しているパッケージです。
このすべての後、プラグイン 'gulp-notify'メッセージでエラーが表示されました:メッセージが見つかりません:notify-send。
これは、Vagrantのプラグインの問題が原因でした。通知をオフにすることもできます。
export DISABLE_NOTIFIER=true;
または、 Vagrant でプラグインをインストールします。
幸運を祈ります。多くの人々の推奨に従っても、私はこれに長い時間を費やしました。
ブランドン
npm install --no-bin-link
。 全体がフラット化されていますnode_modules