Ich bin auf ein merkwürdiges Problem gestoßen - anscheinend haben einige Node.js-Module so tiefe Ordnerhierarchien, dass der Windows-Kopierbefehl (oder der PowerShell-Befehl, Copy-Item
den wir tatsächlich verwenden) den berüchtigten Fehler "Pfad zu lang" trifft, wenn der Pfad über 250 liegt Zeichen lang.
Dies ist beispielsweise eine Ordnerhierarchie, die ein einzelnes Knotenmodul erstellen kann:
node_modules\nodemailer\node_modules\simplesmtp\node_modules\
xoauth2\node_modules\request\node_modules\form-data\node_modules\
combined-stream\node_modules\delayed-stream\...
Es scheint verrückt zu sein, ist aber mit Node-Modulen Realität.
Wir müssen während der Bereitstellung Copy-Paste verwenden (wir verwenden keine "clevere" Zielplattform wie Heroku, bei der eine Git-Bereitstellung eine Option wäre), und dies ist eine schwerwiegende Einschränkung unter Windows.
Gibt es nicht einen npm-Befehl oder etwas, das den node_modules
Ordner komprimiert oder nur das enthält, was zur Laufzeit tatsächlich erforderlich ist? (Knotenmodule enthalten normalerweise test
Ordner usw., die wir nicht bereitstellen müssen.) Haben Sie weitere Ideen, wie Sie das umgehen können? Windows nicht zu benutzen ist leider keine Option :)
package.json
With-dependencies
Set? Wenn ja, könnten Sie ohnenode_modules
und mit npm toinstall
oderupdate
den Abhängigkeiten kopieren ?npm install
in der Zielumgebung nicht. Sie erstellt lokal ein "Bereitstellungspaket" (im Grunde eine ZIP- Datei plus einige Metadaten), das dann auf den Zielcomputer hochgeladen, dort extrahiert und fertig ist. Also muss ichnode_modules
direkt einbeziehen.Antworten:
npm v3 (kürzlich veröffentlicht) löst dieses Problem, indem die Abhängigkeiten reduziert werden. Lesen Sie die Versionshinweise hier unter https://github.com/npm/npm/releases/tag/v3.0.0 unter
flat flat
Abschnitt.Und der letzte Kommentar zu diesem Thema https://github.com/npm/npm/issues/3697
quelle
flat flat
sind jetzt auf einer anderen Seite vergraben. Hier ist ein direkter Link: github.com/npm/npm/releases/tag/v3.0.0nur um das hinzuzufügen ... eine andere Sache, die mir geholfen hat, war die Auflistung aller installierten Module mit
npm ls
.Das gibt Ihnen einen Baum von Modulen und Versionen ... von dort aus ist es ziemlich einfach zu identifizieren, welche Duplikate sind ...
npm dedupe
hat nichts für mich getan. Ich bin mir nicht sicher, ob das ein Fehler ist oder was (Node v 10.16)Wenn Sie also ein doppeltes Modul identifiziert haben, installieren Sie es mithilfe von im Stammverzeichnis node_module
npm install [email protected] --save-dev
. Die Version ist wichtig.Danach habe ich mein Verzeichnis node_modules gelöscht und ein neues erstellt
npm install
.Kurzfassung
npm ls
um eine Liste aller installierten Module zu erhalten.npm install module@version --save-dev
um diese Module im Stammverzeichnis node_modules zu installieren und package.json zu aktualisieren.rmdir node_modules
um das Verzeichnis node_modules zu löschen.npm install
um eine neue Kopie Ihrer Abhängigkeiten abzurufen.Sobald ich das tat, war alles viel sauberer.
Ich empfehle außerdem, Ihre package.json-Datei zu kommentieren, um zu zeigen, welche heruntergefahren wurden, um den node_modules-Baum zu reduzieren.
quelle
Ich denke nicht, dass es angesichts Ihrer Einschränkungen eine großartige Lösung gibt, aber hier sind einige Dinge, die helfen können.
npm dedupe
, Ihre Verzeichnishierarchie zu optimieren, um einige Pfade zu verkürzennpm install --production
diese Option, um ohne die Entwicklungstools zu installierennode_modules
Verzeichnisyour_project/node_modules/pkg_with_deep_deps
, in dem sie genügend kurze Pfade haben, aber trotzdem funktionieren. Das wäre also soyour_project/node_modules/pkg_with_deep_deps/node_modules
.require
sollte in der Lage sein, diese zur Laufzeit richtig zu finden. Sie müssen nur klar dokumentieren, was Sie manuell geändert haben, warum Sie es getan haben, und Ihre eigenen wahren Abhängigkeiten genau darstellenpackage.json
Hier ist eine Diskussion zum Thema Github , in der dieses Problem ausführlich behandelt wird.
quelle
dedupe
(wusste überhaupt nichts davon) und--production
(npm install -h
zeigte diese Option nicht)! Die Verwendung eines ZIP-Archivs ist leider keine Option, siehe Kommentar oben.Ich habe ein Knotenmodul namens "npm-flatten" geschrieben, das Ihre Abhängigkeiten für Sie hier abflacht: https://www.npmjs.org/package/npm-flatten
Wenn Sie nach einer Verteilung suchen, habe ich auch ein NuGet-Paket geschrieben, das eine vollständige node.js-Umgebung in Ihr .NET-Projekt integriert: http://www.nuget.org/packages/NodeEnv/
Feedback wäre willkommen.
quelle
Etwas, das mir geholfen hat, war, ein lokales Laufwerk meinem Ordner Node.js zuzuordnen:
Nettonutzung n: \ Computername \ c $ \ Benutzer \ mein Name \ Dokumente \ node.js / persistent: ja
Vorher: c: \ Benutzer \ mein Name \ Dokumente \ node.js \ Projektname (45 Zeichen) Nachher: n: \ Projektname (14 Zeichen, das sind 31 Zeichen weniger)
In vielen Fällen konnten dadurch einige Module installiert werden.
Ich werde sagen, dass ich dieses Problem heute gerade wieder entdeckt habe, als ich versucht habe, meinen gesamten Code auf einem USB-Laufwerk zu sichern.
"C: \ Benutzer \ mein Name \ Dokumente \ Node.js \ Angular-Phonecat \ Knotenmodule \ Karma \ Knotenmodule \ Chokidar \ Knotenmodule \ Anymatch \ Knotenmodule \ Mikromatch \ Knotenmodule \ Regex-Cache \ Knotenmodule \ Benchmarked \ Knotenmodule \ Dateireader \ node_modules \ verlängern-flach \ Benchmark \ Geräte ist zu lang. "
Selbst wenn ich versuchte, sie mit dem Laufwerksbuchstaben N: zu sichern, schlug dies in einigen Fällen aufgrund von Pfadlängen fehl, aber es reichte gerade aus, um den obigen Fehler zu beheben.
quelle
1) Während der Release-Erstellung können Sie verhindern, dass Visual Studio diese Dateien / Ordner scannt, indem Sie die Ordnereigenschaften als versteckten Ordner festlegen (setzen Sie ihn NUR auf node_modules). Referenz: http://issues.umbraco.org/issue/U4-6219#comment=67-19103
2) Sie können Dateien oder Ordner ausschließen, die während des Packens veröffentlicht werden, indem Sie den folgenden XML-Knoten in die CsProject-Datei aufnehmen.
quelle
Ich habe eine Lösung aus den Microsoft Node.js-Richtlinien gefunden .
> npm install -g rimraf
Dateien löschen, die überschreitenmax_path
> npm dedupe
Verschiebt doppelte Pakete auf die oberste Ebene> npm install -g flatten-packages
Verschiebt alle Pakete auf die oberste Ebene, kann jedoch zu Versionsproblemen führennpm@3
welche Versuche, dienode_modules
Ordner-Hierarchie maximal flach zu machen.> npm install –g npm-windows-upgrade
quelle
Dies ist keine richtige Lösung, sondern eine Lösung, wenn Sie es eilig haben. Sie können jedoch 7-Zip verwenden, um Ihren Ordner zu komprimieren, die komprimierte Datei zu verschieben und sie ohne Probleme zu entpacken.
Wir haben diese Lösung verwendet, um eine Node.js-Anwendung bereitzustellen, bei der eine saubere npm-Installation nicht möglich war.
quelle