Wie kann ich npm in einem bestimmten Verzeichnis installieren?

Antworten:

325

Sie können die --prefixOption verwenden:

mkdir -p ./install/here/node_modules
npm install --prefix ./install/here <package>

Die Pakete werden dann in installiert ./install/here/node_modules. Das ist mkdirnotwendig, weil npm sonst könnte ein bereits existierendes wählt node_modulesVerzeichnis weiter oben in der Hierarchie. (Siehe npm-Dokumentation zu Ordnern .)

Coudy
quelle
65
Es scheint, dass Sie die Datei package.json in diesem alternativen Verzeichnis haben müssen, wenn Sie die Option --prefix verwenden. Gibt es eine Möglichkeit, package.json im aktuellen Verzeichnis zu haben und im alternativen Verzeichnis zu installieren?
2
@fractal Siehe meine Antwort dafür
yunzen
10
@coundy Gibt es eine Möglichkeit, den Pfad für npm install(ohne Paketnamen) anzugeben ? Ich habe das direkt angefragt, aber dann sucht npm package.jsonin der {prefix}. Was ich auch anstrebe ist, in der Lage zu sein, das packages.jsonim Projekt root zu lassen und gleichzeitig alle Pakete in zu installieren {project root}/{project webroot}.
Automatix
Ich bin auf ein Rekursionsproblem gestoßen. Gibt es eine Möglichkeit, es einmal auszuführen? Ich habe es vorübergehend gelöst, indem ich das Verzeichnis gewechselt und dann aufgerufen habe npm install, aber es --prefixscheint eine schönere Lösung zu sein, wenn es keine Rekursion verursacht hat.
adi518
47

In der Dokumentation heißt es: Verwenden Sie die Präfixoption zusammen mit der globalen Option :

Die Präfixkonfiguration ist standardmäßig der Speicherort, an dem der Knoten installiert ist. Auf den meisten Systemen ist dies / usr / local . Unter Windows ist dies die genaue Position der binären Datei node.exe. Auf Unix-Systemen ist es eine Ebene höher , da der Knoten normalerweise unter {Präfix} / bin / Knoten und nicht unter {Präfix} / Knoten.exe installiert wird .

Wenn das globale Flag gesetzt ist, installiert npm Dinge in dieses Präfix. Wenn es nicht festgelegt ist, wird das Stammverzeichnis des aktuellen Pakets oder das aktuelle Arbeitsverzeichnis verwendet, sofern es nicht bereits in einem Paket enthalten ist.

(Hervorhebung durch sie)

Also in Ihrem Stammverzeichnis können Sie mit installieren

npm install --prefix <path/to/prefix_folder> -g

und es wird den node_modulesOrdner in den Ordner installieren

<path/to/prefix_folder>/lib/node_modules
Yunzen
quelle
2
Sie können keine requireglobal installierten Pakete, oder?
Pavlo
3
@Pavlo Hilft das? stackoverflow.com/questions/15636367/…
yunzen
1
Sie sollten dies zur Antwort hinzufügen.
Pavlo
6
@Pavlo Ich glaube nicht. Es ist nicht die Antwort auf das OP.
Yunzen
@Pavlo Wenn ein Paket global installiert ist, benötigen Sie es wie immer. Ja, Sie können ein Paket benötigen, das global installiert ist.
Rob Evans
43

Ab npm Version 3.8.6 können Sie verwenden

npm install --prefix ./install/here <package>

im angegebenen Verzeichnis zu installieren. NPM erstellt automatisch einen node_modulesOrdner, auch wenn bereits ein node_modulesVerzeichnis in der höheren Hierarchie vorhanden ist. Sie können a auch package.jsonim aktuellen Verzeichnis haben und es dann mit der folgenden --prefixOption im angegebenen Verzeichnis installieren :

npm install --prefix ./install/here

Ab npm 6.0.0 können Sie verwenden

npm install --prefix ./install/here ./

um die Datei package.json im aktuellen Verzeichnis im Verzeichnis "./install/here" zu installieren. Auf einem Mac ist mir aufgefallen, dass ein Symlink zum übergeordneten Ordner im Verzeichnis node_modules erstellt wird. Aber es funktioniert immer noch.

HINWEIS: NPM berücksichtigt den Pfad, den Sie über die --prefixOption angegeben haben. Es wird gemäß der npm-Dokumentation für Ordner nur dann aufgelöst, wenn npm installes ohne die --prefixOption verwendet wird.

Rohit Sharma
quelle
1
Das scheint nicht zu funktionieren, ich bekomme immerCan't install <current directory>: Missing package name
Tibor Blenessy
1
@TiborBlenessy Angenommen, Sie sprechen von der zweiten Installationsanweisung. Stellen Sie sicher, dass sich in Ihrem aktuellen Verzeichnis eine gültige Datei package.json befindet. Wenn es dann immer noch nicht funktioniert, teilen Sie mir Ihre npm-Version mit. Diese Schritte wurden verwendet, um mit der angegebenen npm-Version zu arbeiten. Und wenn sie es nicht mehr tun, würde ich gerne tief tauchen und zur Grundursache gelangen, und vielleicht kann ich mir eine Alternative ausdenken.
Rohit Sharma
1
@RohitSharma Mit npm 6.0.0 funktioniert diese Methode nicht, da sie die package.jsonDatei in erwartet./install/here
Christian Ivicevic
@ChristianIvicevic Mit npm install --prefix ./install/here ./ können Sie die Datei package.json im aktuellen Verzeichnis im Verzeichnis "./install/here" installieren. Auf einem Mac ist mir aufgefallen, dass ein Symlink zum übergeordneten Ordner im Verzeichnis node_modules erstellt wird. Aber es funktioniert immer noch mit npm 6.0.0
Rohit Sharma
1
@ Tanoro Der dritte Befehl funktioniert mit npm 6.0.0 mit Symlink-Erstellung, wie in der Antwort erwähnt. Ich habe noch nie die ersten beiden Befehle mit npm v3.5.2 ausprobiert, weshalb ich die spezifische Version von npm erwähnt habe, mit der ich es versucht hatte. Sie können die Antwort auch mit Arbeitsbefehlen für andere Versionen aktualisieren.
Rohit Sharma
0

Ich verwende einen Powershell-Build und konnte npm nicht ausführen, ohne das aktuelle Verzeichnis zu ändern.

Endete mit dem Befehl start und gab nur das Arbeitsverzeichnis an:

start "npm" -ArgumentList "install --warn" -wo $buildFolder
Malachy
quelle