Ich versuche, global zu installieren und dann zu verwenden forever
und forever-monitor
wie folgt:
npm install -g forever forever-monitor
Ich sehe die übliche Ausgabe und auch die Operationen, die die Dateien in den globalen Pfad kopieren, aber wenn ich es versuche, require("forever");
erhalte ich eine Fehlermeldung, dass das Modul nicht gefunden wurde.
Ich verwende die neueste Version von Node und Npm und weiß bereits, welche Änderungen Npm bei der globalen oder lokalen Installation vorgenommen hat, aber ich möchte wirklich nicht bei jedem Projekt Localy installieren und arbeite auf einer Plattform, die dies nicht tut Ich unterstütze das nicht link
, npm link
nachdem eine globale Installation für mich nicht möglich ist.
Meine Frage ist: Warum kann ich kein global installiertes Paket benötigen? Ist das eine Funktion oder ein Fehler? Oder mache ich etwas falsch?
PS: Nur um es kristallklar zu machen: Ich möchte nicht lokal installieren.
~/.config/yarn/global
für GarnAntworten:
In Node.js sucht require nicht in dem Ordner, in dem globale Module installiert sind.
Sie können dies beheben, indem Sie die Umgebungsvariable NODE_PATH festlegen. Unter Linux ist dies:
Hinweis: Dies hängt davon ab, wo Ihre globalen Module tatsächlich installiert sind.
Siehe: Laden aus den globalen Ordnern .
quelle
export NODE_PATH=/usr/local/lib/node_modules
stattdessen verwenden.NODE_PATH
UmgebungsvariablenC:\Users\{USERNAME}\AppData\Roaming\npm\node_modules
wahrscheinlich.%AppData%\npm\node_modules
wird unter Windows 10NODE_PATH
kann ich globale und lokale Module gleichzeitig verwenden?NODE_PATH=$(npm root -g)
Nachdem Sie das Paket global installiert haben, müssen Sie das lokale Projekt mit dem globalen Paket verknüpfen
Siehe hier
quelle
~/some-stand-alone-random-nodejs-test.js
. Ich möchte meinen Home-Ordner nicht in ein Projektverzeichnis verwandeln. Ich möchte nicht für jedes kleine Experiment neue Ordner erstellen.npm link <module>
Anschließend wird eine Verknüpfung (Link) im Ordner node_module Ihres Projekts erstellt, die auf das globale Knotenmodul verweist.Entschuldigung für die Nekromantie, aber ich kann fest codierte Pfade zu global installierten Modulen angeben:
Dies ist nicht perfekt, aber wenn man bedenkt, dass Unity3d versucht, alles im Projektverzeichnis enthaltene Javascript zu "kompilieren", kann ich wirklich keine Pakete installieren.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich bin darauf gestoßen, als ich versucht habe, eine Versionsprüfung mit
semver
einempreinstall
Skript in durchzuführenpackage.json
. Da ich wusste, dass ich mich nicht auf installierte lokale Module verlassen kann, habe ich dies verwendet, um essemver
aus dem globalennode_modules
Ordner zu fordern (npm
je nachdem, weiß ich, dass es dort ist):Ich mag diesen Ansatz, da hierfür keine speziellen Module installiert werden müssen.
Ich habe mich nicht für eine
NODE_PATH
Lösung entschieden, wie sie andere vorgeschlagen haben, da ich wollte, dass diese auf jedem Computer funktioniert, ohne dass vor dem Ausführen zusätzliche Konfigurationen / Einstellungen erforderlich sindnpm install
ich für mein Projekt ausgeführt werde.So wie dies codiert ist, werden garantiert nur Module der obersten Ebene (installiert mit
npm install -g ...
) oder Module gefunden, die vonnpm
(wiedependencies
hier aufgeführt: https://github.com/npm/npm/blob/master/package.json ) benötigt werden. Wenn Sie eine neuere Version von NPM verwenden, werden möglicherweise Abhängigkeiten von anderen global installierten Paketen gefunden, da es eine flachere Struktur für gibtnode_modules
jetzt Ordner gibt.Hoffe das ist nützlich für jemanden.
quelle
Gemäß der Dokumentation sucht Node.js standardmäßig an folgenden Orten:
In der
NODE_PATH
Umgebungsvariablen angegebener Pfad .Hinweis: Die
NODE_PATH
Umgebungsvariable wird auf eine durch Doppelpunkte getrennte Liste absoluter Pfade festgelegt.Aktueller
node_modules
Ordner. (lokal)$HOME/.node_modules
(global)Hinweis:
$HOME
ist das Home-Verzeichnis des Benutzers.$HOME/.node_libraries
(global)$PREFIX/lib/node
(global)Hinweis:
$PREFIX
Ist Node.js konfiguriertnode_prefix
.node_prefix
Führen Sie Folgendes aus , um den aktuellen Wert von zu überprüfen :Hinweis: Das Präfix entspricht dem
--prefix
Parameter während der Erstellung und ist relativ zuprocess.execPath
. Nicht mit dem Wert desnpm config get prefix
Befehls zu verwechseln . QuelleWenn das angegebene Modul nicht gefunden werden kann, bedeutet dies, dass es an keiner der oben genannten Stellen vorhanden ist.
Der Speicherort des globalen Stammordners, in dem Module installiert sind, kann wie
npm root -g
folgt gedruckt werden: (Standardmäßig wird der Pfad zur Laufzeit berechnet, sofern er nicht in dernpmrc
Datei überschrieben wird. )Lösung
Sie können die folgenden Problemumgehungen ausprobieren:
Geben Sie Ihren globalen Modulspeicherort in der
NODE_PATH
Umgebungsvariablen an. Z.BNODE_PATH
Führen Sie Folgendes aus , um den Wert von zu testen und auszudrucken :Verknüpfen Sie Ihren
$HOME/.node_modules
globalen Benutzerordner, um auf den Stammordner zu verweisen, indem Sie diesen Befehl ausführen, um eine dauerhaftere Lösung zu erhalten :Testen Sie es dann erneut über den
echo 'require("forever")' | node
Befehl :.Ändern Sie vorübergehend den aktuellen Ordner in den Ort, an dem die Erweiterung global installiert wurde, bevor Sie das Skript aufrufen. Z.B
Konfigurieren Sie das globale Installationsziel in der
npm
userconfig-Datei (siehe :)npm help 5 npmrc
oder mituserconfig
param (--prefix
).Führen Sie Folgendes aus, um die aktuelle Konfiguration anzuzeigen :
npm config list
.Führen Sie Folgendes aus, um die aktuelle Konfiguration zu bearbeiten :
npm config edit
.Geben Sie beim Aufruf den vollständigen Pfad des Speicherorts des Knotenmoduls an
require()
. Z.BInstallieren Sie das Paket an einem benutzerdefinierten Speicherort, z
Die Installation wird jedoch untergehen
~/.node_modules/lib/node_modules/
, sodass der Speicherort noch hinzugefügt werden muss.Siehe: Lokales Installationspaket für npm an einem benutzerdefinierten Speicherort
Erstellen Sie einen Symlink im aktuellen Ordner vom Speicherort des globalen Pakets. Z.B
quelle
Sie können das Paket verwenden
requireg
, um dieses Problem zu lösen:wird den Trick machen.
Außerdem gibt es ein weiteres Modul,
global-npm
während spezifisch nur die globale Verwendungnpm
, können Sie in dem aussehen kurzen Code und sehen , wie die Technik funktioniert.quelle
NODE_PATH
ist auch, dass Sie keinen Code ändern müssen. (Mein Anwendungsfall besteht darin, viele Studentenprojekte zu bewerten, bei denen ich nichtnpm install
für jedes einzelne ausführen möchte und auch nicht möchte, dass sie einnode_modules
Verzeichnis bereitstellen. )requireg
, das ist der springende Punkt.Für CLI-Dienstprogramme, die von großen Modulen abhängen, z. B. möchte
puppeteer
ich ein Spawn erzeugennpm root -g
und es verwenden, um das globale Modul zu benötigen.quelle
Sie können diese Zeile in Ihre
.profile
Datei einfügen:Dadurch wird
node
der globale Pfad verwendet.quelle
node_modules
. Dies ist eine alte Antwort, aber ich erinnere mich, dass ich sie irgendwo in der Dokumentation erhalten habe. Auf meinem Computer (im Jahr 2020) befindet sich das globale npm-node_modules
Verzeichnisusr/lib/node_modules
. Wie auch immer, ich vertraue darauf,npm config get prefix
dass es von npm global verwendet wird, wenn ein globales Paket installiert wird, also sollte es richtig sein.package.json
Datei oder inyarn.lock
/ enthalten istpackage-lock.json
.node_modules
Ordner durchsucht, dann übergeordnet, dann übergeordnet, ... bis einnode_modules
Ordner gefunden wird, der dieses Modul enthält. Wenn Sie ein Paket jedoch global installieren, befindet es sich nicht in einemnode_modules
Ordner über dem aktuellen Verzeichnis des Skripts, sodass Sie NODE_PATH als Fallback verwenden, in dem der Knoten nach Paketen sucht.