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
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.
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.
Antworten:
Das Problem mit tief verschachtelten Ordnern unter Windows wurde größtenteils ab der npm-Version behoben
3.x
.Laut npm:
Ich habe gerade npm installiert
3.1.0
und es auf einem Paket ausprobiert, das den gefürchtetenThe specified path, file name, or both are too long
Fehler auslöste .Das Problem ging weg.
Sie können die neuesten npm-Builds hier herunterladen : npm-Releases
quelle
Windows 8.1 und 10 bieten eine Option zum Erhöhen des Win32-Pfadlimits:
gpedit.msc
und drücken Sie Enter)Local Computer Policy\Computer Configuration\Administrative Templates\System\Filesystem
quelle
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.
quelle
Allan -
Aus dem Github-Problem, das Sie verlinkt haben,
Dies ist (endlich) derzeit um npm in Arbeit, unter dem Namen
multi-stage-install
, und wird angestrebtnpm@3
.npm
Entwicklungsleiter Forrest Norvell wird im neuen Jahr einige Zeit mit Windows verbringen. Erstellen Sie daher Windows-bezogene Probleme imnpm
Issue-Tracker < https://github.com/npm/npm/issues >quelle
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:
Ich bin zurückgekommen:
Nach dem Befehl npm ls :
Lassen Sie uns mit npmconf fortfahren - es ist der Container für alle überlangen Dateien, die Probleme verursachen. Wir brauchen npmconf 2.1.1.
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.
quelle
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_modules
bereits 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.quelle
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
.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.
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
quelle
In Fenstern:
C:\scotchbox/public/gulpProject
cmd
und drücken SieEnternpm install
quelle
npm install --no-bin-link
. Sie werden eine ganze abgeflacht habennode_modules
quelle