Knoten npm Windows-Dateipfade sind zu lang, um Pakete zu installieren


87

Lage

Ich möchte gulp und verwandte Front-End-Toolketten in von Windows gehosteten Entwicklungsumgebungen verwenden. Ich stoße an eine Wand und versuche, Gulp-Plug-Ins wie Browser-Sync zu verwenden, da das Ordnerdiagramm node_modules die Windows-Dateipfade zu lang macht, um die Dateien zu kopieren. Ich hätte gerne einen pragmatischen Ansatz, um dieses Problem derzeit unter Windows zu lösen, unabhängig davon, was die Node-Community möglicherweise bereitstellt oder nicht, um die Benutzerfreundlichkeit von npm unter Windows in Zukunft zu verbessern.

2 Fragen

  1. Gibt es einen npm-Workflow für Windows, der genau so funktioniert, wie er beabsichtigt war? "Führen Sie den Befehl aus und installieren Sie die Dateien" (z. B. vergleichbar mit npm unter OSX, npm unter Linux, Ruby Gems oder sogar Nuget) Ich möchte nicht jedes Mal mit einer Reihe manueller Dateibearbeitungen, Symlinks usw. herumspielen npm unter Windows.

  2. Gibt es einen gut dokumentierten, stabilen Cygwin-Workflow für die Ausführung von npm und Knoten, um die Pfadbeschränkungen für Windows-API-Dateien zu umgehen?

Gory Details unten aufgeführt ...

Allgemeines Problem

  • Das Ausführen der npm-Installation an einer Standard-Windows-Eingabeaufforderung schlägt in tief verschachtelten Hierarchien von node_modules fehl.
  • Laut Joyents Github-Repo-Thread ist dies ein anerkanntes Problem ohne angenehme Problemumgehungen für Entwickler in Windows-zentrierten Umgebungen. ( Wirklich? )
  • Der NT-Kernel unterstützt Dateipfadlängen von bis zu 32.767 Zeichen.
  • MAXPATH der Windows-API ist auf 260 Zeichen begrenzt.
  • Die Windows-API verarbeitet Dateivorgänge für alle wichtigen Windows-Shells und vieles mehr, einschließlich: Explorer, CMD, Powershell, MYSgit-Bash usw. ( MS wirklich? Wie lange gibt es NTFS schon? )
  • Cygwin unterstützt lange Dateipfade, aber npm.cmd funktioniert aufgrund der CRF-Formatierung nicht sofort. Ich habe versucht, die DOS2Unix-Transformation auf npm durchzuführen, damit sie mit Cygwin funktioniert, aber es scheint andere Probleme damit zu geben.

Mein aktueller Hack

  • Erstellen Sie einen "n" -Ordner als Staging-Bereich im Stammverzeichnis von C: \, da dies meinen Ordnerpfad verkürzt.
  • Führen Sie npm im Ordner "n" aus, um Module für alles zu installieren, was ich brauche.
  • Starten Sie Cygwin und kopieren Sie mit cp den Ordner node_modules in ein Zielprojekt.
  • Spülen und wiederholen, wenn sich Abhängigkeiten ändern oder wenn ich ein neues Projekt starten muss.

Andere unangenehme Problemumgehungen

Symbolische Links können verwendet werden, um Dateipfade zu verkürzen, aber dies sind klobige Hacks. Wenn das npm-Ökosystem wächst, werden verschachtelte Abhängigkeitsketten zu lang und diese Problemumgehung wird unbrauchbar.

Das Hinzufügen ALLER Abhängigkeiten zur Datei package.json des Stammordners wurde in einem Thread erwähnt, auf den ich gestoßen bin. Obwohl dieser Ansatz die Ordnerstruktur reduziert und das Laden doppelter Module verhindert, ist diese Problemumgehung unnatürlich. Es beeinträchtigt auch die Benutzerfreundlichkeit, Haltbarkeit und Produktivität von npm, da Sie nach der Installation entweder manuell oder mit einigen hackigen Skripten an Dateien und Ordnern herumspielen müssen. Der Ansatz ist auch anfällig für das gleiche Schicksal, unter dem der Ansatz von Symbolic Links möglicherweise leiden wird.


Ich dachte fast, ich hätte das gelöst. Ich habe Cygwin dazu gebracht, mit npm zu arbeiten, indem ich dos2unix util für die folgenden 2 Dateien ausgeführt habe: npm.cmd und npm
Allan McLemore

Windows-API-Pfadbeschränkungen machen npm unbrauchbar, da einige npm-Module Visual Studio zum Erstellen von Dateien verwenden. Dies ist der Fehler, den ich erhalte, wenn ich npm Browser-Sync: C: \ Programme (x86) \ MSBuild \ Microsoft.Cpp \ v4.0 \ V120 \ Microsoft.CppBuild.targets (301,5): Fehler MS B3491: Könnte Schreiben Sie keine Zeilen in die Datei "Release \ obj \ Validation \ Validation.tlog \ Validation.lastbuilds Tate". Der angegebene Pfad, Dateiname oder beide sind zu lang. Der vollständig qualifizierte Dateiname muss weniger als 260 Zeichen und der Verzeichnisname weniger als 248 Zeichen enthalten.
Allan McLemore

Möglicherweise habe ich einen "Taffy-Pulling" -Ansatz, um Knotenmodule unter Windows mit npm zu laden. Es umfasst einige der folgenden Runden: npm install, npm dedupe, npm shrink und rm -r node_modules. Wenn Sie dies wiederholt tun, werden die langen Dateipfade bis zu einem gewissen Grad ausgebügelt, aber es ist so, als würden Sie Taffy ziehen (z. B. erst, wenn Sie fertig sind). Hat jemand dies kodifiziert oder ein automatisiertes Tool geschrieben, um dies schlüsselfertiger zu machen?
Allan McLemore

Apropos "Hacky-Skripte", ich habe eines geschrieben, das ich nicht als SCHRECKLICH hackig empfinde. Ich habe ein Tool namens fenestrate erstellt, mit dem Sie die Verzeichnisstruktur Ihrer Module nach der Installation programmgesteuert reduzieren können. Sie können es als globalen npm-Postinstall-Hook installieren.
Zetlen

2
@yoneal Für den persönlichen Gebrauch und um schnell loszulegen, sollte fenestrate Ihren Ordner node_modules rekursiv durchsuchen, sodass Sie ihn nicht manuell in tiefen Abhängigkeiten ausführen müssen. Es wäre jedoch großartig, diese Abhängigkeiten zu teilen - ich denke, dass viele gegabelte Module mit einfachen Fenestrate-Konfigurationen eine großartige Nachricht an die npm-Betreuer senden würden.
Zetlen

Antworten:


58

Das Problem mit tief verschachtelten Ordnern unter Windows wurde größtenteils ab der npm-Version behoben 3.x.

Laut npm:

.npm @ 3 macht die Installation "maximal flach", indem alles, was es kann, auf die Knotenmodule der obersten Ebene gehoben wird. Dies bedeutet, dass Verschachtelungen nur bei Konflikten auftreten und Bäume daher niemals sehr tief werden sollten. Daher sollte die Windows-Pfadlängenbeschränkung nicht beachtet werden.

Ich habe gerade npm installiert 3.1.0und es auf einem Paket ausprobiert, das den gefürchteten The specified path, file name, or both are too longFehler auslöste .

Das Problem ging weg.

Sie können die neuesten npm-Builds hier herunterladen : npm-Releases


4
Ich hatte auch einen Erfolg mit dem npm 3.x-Update auf einem Windows-Computer. Schamloser Plug: Ich schrieb einen Artikel über npm 3 auf Windows triplet.fi/blog/…
Tx3

21

Windows 8.1 und 10 bieten eine Option zum Erhöhen des Win32-Pfadlimits:

  • Öffnen Sie den Gruppenrichtlinien-Editor (Drücken Sie Windows+ Rund geben Sie ein gpedit.mscund drücken Sie Enter)
  • Navigieren Sie zu folgendem Verzeichnis: Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
  • Doppelklicken Sie auf die Option Win32 Long Paths aktivieren und aktivieren Sie sie.

Geben Sie hier die Bildbeschreibung ein


Option war für mich nicht verfügbar, und fwiw, ich habe ein Upgrade von Win 7 Pro durchgeführt, also ist das eine mögliche Ursache
Evan Morrison

@EvanMorrison "Dateisystem \ NTFS \ NTFS-Langpfade aktivieren" wurde in späteren Win10-Builds in "Dateisystem \ Win32-Langpfade aktivieren" umbenannt. Ich habe die Antwort zum späteren Nachschlagen aktualisiert.
Marcelo Mason

1
jede Idee für Win Server 2012 R2
sairfan

12

Dies ist eine Umgehungslösung.

Es gibt einige Knotenmodule, die Ihre Abhängigkeiten für Sie abflachen.
Links sind hier:

Was diese Module tun, kann auch manuell erfolgen. Dies ist die einzige echte Lösung, die es derzeit gibt, dh alle Module auf einer Ebene zu haben, die einander erfordern, anstatt dass alle privaten Kopien ihrer Abhängigkeiten tief verschachtelt sind.


10
Ich fand Flatten-Pakete gut dokumentiert und einfach zu bedienen.
StriplingWarrior

3

Allan -

Aus dem Github-Problem, das Sie verlinkt haben,

npm fügt standardmäßig die Deduplizierung bei der Installation hinzu. Dies ist wesentlich praktikabler als das Ändern des Modulsystems von Node, aber es ist immer noch nicht ganz trivial und erfordert eine Menge Überarbeitung einiger lang verwurzelter Muster.

Dies ist (endlich) derzeit um npm in Arbeit, unter dem Namen multi-stage-install, und wird angestrebt npm@3. npmEntwicklungsleiter Forrest Norvell wird im neuen Jahr einige Zeit mit Windows verbringen. Erstellen Sie daher Windows-bezogene Probleme im npmIssue-Tracker < https://github.com/npm/npm/issues >


3

Ich habe das gleiche Problem. Das Reduzieren der Abhängigkeiten ist keine vollständige Lösung, da Sie möglicherweise Module verwenden, die von verschiedenen Versionen desselben abhängigen Moduls abhängen. Ich habe festgestellt, dass das gulp-run-Modul nach dem Reduzieren nicht mehr funktioniert (im Zusammenhang mit Modulannahmen zu bin / .bin-Verzeichnissen, vermute ich). Drat!

Es gibt viele Diskussionen über das Problem, aber keine Lösung in Sicht: https://github.com/joyent/node/issues/6960

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

Eine Problemumgehung, die für mich funktioniert, besteht darin, Abhängigkeiten manuell hinzuzufügen, die mein Projekt nicht explizit benötigt.

Wenn Sie herausfinden möchten, welche Pakete Ihnen Probleme bereiten , fand ich PathLengthChecker sehr nützlich. Extrahieren Sie einfach die EXE-Datei und führen Sie die GUI oder die Befehlszeilen-App aus. Die andere Möglichkeit, das Problem aufzudecken, besteht darin, zu versuchen, in Visual Studio zu erstellen. Dies schlägt jedoch fehl, ohne dass Sie erfahren, welcher Verzeichnisname zu lang ist.

Hier ist ein Befehlszeilenbeispiel für meine Problemumgehung:

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

Ich bin zurückgekommen:

261: C: \ wirklich langes Verzeichnis wird in den Fenstern \ Knotenmodule \ Grunt-Bower-Task \ Knotenmodule \ Bower \ Knotenmodule \ Update-Notifier \ Knotenmodule \ neueste Version \ Knotenmodule \ Paket-JSON \ keine De-Module \ Registrierungs-URL \ Knotenmodule \ npmconf \ Knotenmodule \ config-chain \ readme.markdown

[snip - es waren 12 von ihnen]

Nach dem Befehl 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

Lassen Sie uns mit npmconf fortfahren - es ist der Container für alle überlangen Dateien, die Probleme verursachen. Wir brauchen npmconf 2.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

Keine Ergebnisse - alle Dateien sind in Grenzen!

Die offensichtliche Einschränkung hierbei ist, dass es nur einmal pro Paket funktioniert - Abhängigkeiten von verschiedenen Versionen desselben Moduls können nicht auf der Ebene des Stammknotenmoduls installiert werden, da der Knoten keine Versionen in der Verzeichnisstruktur berücksichtigt.

Diese Problemumgehung ist nicht perfekt, löst jedoch meine Hauptziele, dass Knoten unter Windows funktionieren. Da die Auflösung in package.json richtig ist, funktioniert die Problemumgehung für andere Entwickler und erstellt Server ohne manuelle oder globale Probleme.


2

Wenn Sie mit der globalen Installation einverstanden sind, kann dies eine Problemumgehung sein:

Sie können den Pfad, in dem npm die globalen Module installiert, auf einen sehr kurzen Pfad einstellen (normalerweise ist es :), der c:\users\\{username}\AppData\Roaming\npm\npm_modulesbereits viele Zeichen enthält.

Informationen zum Anpassen finden Sie hier: Ändern Sie das globale Standardinstallationsverzeichnis für node.js-Module in Windows?

Wenn Sie es anpassen, z. B. c:\n\in einigen Fällen, kann das Problem möglicherweise behoben werden.


1

Das hat es endlich für mich behoben ...

Nachdem Sie gulp installiert und Fehler erhalten haben, führen Sie ... gulp aus

Wenn ein Paket fehlschlägt, installieren Sie es manuell mit --no-bin-link.

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

Wobei {package} das Paket ist, bei dem Probleme auftreten.

Nach all dem erhielt ich einen Fehler im Plugin 'gulp-notify' Nachricht: nicht gefunden: notify-send.

Dies lag an einem Plugin-Problem mit Vagrant. Sie können entweder Benachrichtigungen deaktivieren.

export DISABLE_NOTIFIER=true;

Oder installieren Sie das Plugin mit Vagrant .

Viel Glück. Ich habe lange Zeit damit verbracht, auch nachdem ich den Empfehlungen vieler Leute gefolgt war.

Brandon


0

In Fenstern:

  1. Navigieren Sie mit Ihrem Windows Explorer zu Ihrem freigegebenen Vagabundordner (ich verwende übrigens Scotchbox), z C:\scotchbox/public/gulpProject
  2. Geben Sie in die Adressleiste des Ordners ein cmdund drücken SieEnter
  3. Mach deine Schluck-Installation npm install

1
Vermeiden Sie das Einfügen derselben Antwort . Sie sollten stattdessen als Duplikat markieren. Schwöre außerdem nicht in deinem Beitrag.
Tunaki

0

npm install --no-bin-link. Sie werden eine ganze abgeflacht haben node_modules

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.