Wie lege ich einen benutzerdefinierten Speicherort für die lokale Installation des npm-Pakets fest?


177

Ist es möglich, ein benutzerdefiniertes Paketziel für npm installentweder über ein Befehlsflag oder eine Umgebungsvariable anzugeben ?

Standardmäßig landen lokale npm-Installationen node_modulesim aktuellen Verzeichnis, aber ich möchte, dass sie beispielsweise in node_moduleseinem anderen Verzeichnis installiert werden vendor/node_modules. Wie kann ich das erreichen?


Was versuchst du zu erreichen? Dies wurde hier besprochen: stackoverflow.com/questions/13668097/…
Pascal Belloncle

10
@PascalBelloncle: Anstatt Pakete in Unterverzeichnissen von ./node_moduleszu installieren, möchte ich, dass npm sie in Unterverzeichnissen von installiert ./vendor/node_modules. (Oder zu sagen, dass das nicht konfigurierbar ist.)
pje

1
Ich habe verstanden, dass Sie genau das tun möchten, was ich nicht sofort für möglich halte. Plus erfordern würde auch nicht funktionieren. Also habe ich gefragt, warum du das machen willst. Vielleicht gibt es eine alternative Lösung, um das zu tun, was Sie wollen.
Pascal Belloncle

1
Ich installiere ein Paket nur für seine Binärdatei (dh es wird nur in der Befehlszeile verwendet und niemals required), aber ich möchte es nicht global installieren.
pje

Aha. Siehe dann meinen Vorschlag unten.
Pascal Belloncle

Antworten:


180

TL; DR

Sie können dies tun, indem Sie das --prefixFlag und das --globalFlag * verwenden.

pje@friendbear:~/foo $ npm install bower -g --prefix ./vendor/node_modules
bower@0.7.0 /Users/pje/foo/vendor/node_modules/bower

* Obwohl dies eine "globale" Installation ist, können installierte Bins nur über die Befehlszeile aufgerufen werden, wenn sie in ~/foo/vendor/node_modulesvorhanden sind PATH.

TL; R.

Jedes konfigurierbare Attribut von npmkann an sechs verschiedenen Stellen festgelegt werden. Nach Wichtigkeit geordnet:

  • Befehlszeilen-Flags: --prefix ./vendor/node_modules
  • Umgebungsvariablen: NPM_CONFIG_PREFIX=./vendor/node_modules
  • User Config File: $HOME/.npmrcoder userconfigparam
  • Globale Konfigurationsdatei : $PREFIX/etc/npmrcoder userconfigparam
  • Eingebaute Konfigurationsdatei: path/to/npm/itself/npmrc
  • Standardkonfiguration: node_modules / npmconf / config-defs.js

Standardmäßig werden lokal installierte Pakete verwendet ./node_modules. Globale gehen in die prefixKonfigurationsvariable ( /usr/localstandardmäßig).

Sie können ausführen npm config list, um Ihre aktuelle Konfiguration anzuzeigen und npm config editzu ändern.

PS

Im Allgemeinen ist npmdie Dokumentation sehr hilfreich. Der Ordnerbereich bietet eine gute strukturelle Übersicht über npm und der Konfigurationsabschnitt beantwortet diese Frage.


2
Wenn ich den obigen Befehl befolge, wird er beim ./vendor/node_modules/lib/bowerVerwenden vonnpm#3.8.0
e-cloud

2
Wenn ich das tue, No version provided in package.json
bekomme

Du schreibst bins won't be accessible through the command line. Das Programm kann natürlich über den vollständigen Pfad npm install eslint@3.4.0 -g --prefix c:\my_npm` calling c: \ my_npm \ eslint --fix my.js`
Bernhard Döbler

13
Ist es möglich, mit einer package.json-Datei etwas Ähnliches zu erreichen? Wenn ich also npm installin Verzeichnis A mit der Datei package.json ausgeführt werde, werden Pakete in Verzeichnis B installiert. Diese Lösung scheint für einzelne Pakete zu gelten, die installiert werden.
Ryan-Neal Mes

1
Gibt es eine Möglichkeit, alle Abhängigkeiten mit dieser Methode zu installieren? npm installInstalliert Abhängigkeiten lokal. npm install X -g -prefix "..."Installiert Modul X auf das Präfix, npm install -g -prefix "..."installiert das aktuelle Paket auf das Präfix.
AnnanFay

28

Wenn Sie dies in config möchten, können Sie npm config wie folgt einstellen:

npm config set prefix "$(pwd)/vendor/node_modules"

oder

npm config set prefix "$HOME/vendor/node_modules"

Überprüfen Sie Ihre Konfiguration mit

npm config ls -l

Oder wie @pje sagt und benutze die --prefixFlagge


4
Ich glaube, dies setzt das globale Präfix? Das npm installwird also weiterhin lokal installiert, ./node_modulesaber npm install -ginstalliert "$(pwd)/vendor/node_modules". Ich kann mir vorstellen, diese Einstellungen zu ändern und sie dann zu vergessen. Später frage ich mich, warum meine globalen Pakete sich seltsam verhalten.
AnnanFay

13

Unter OSX können Sie zu Ihrem Benutzer $HOME(wahrscheinlich / Users / yourname /) wechseln und, falls noch nicht vorhanden, eine .npmrcDatei erstellen (eine Datei, die npm für die Benutzerkonfiguration verwendet), und ein Verzeichnis für Ihre npm-Pakete erstellen installiert werden in (z. B. / Users / yourname / npm). Setzen Sie in dieser .npmrc-Datei "Präfix" auf Ihr neues npm-Verzeichnis, in dem "global" installierte npm-Pakete installiert werden. Diese "globalen" Pakete stehen natürlich nur Ihrem Benutzerkonto zur Verfügung.

In .npmrc:

prefix=${HOME}/npm

Führen Sie dann diesen Befehl über die Befehlszeile aus:

npm config ls -l

Es sollte eine Ausgabe sowohl für Ihre eigene lokale Konfiguration als auch für die globale npm-Konfiguration liefern, und Sie sollten sehen, dass Ihre lokale Präfixkonfiguration reflektiert wird, wahrscheinlich ganz oben in der langen Liste der Ausgaben.

Aus Sicherheitsgründen empfehle ich diesen Ansatz zum Konfigurieren des npm-Verhaltens Ihres Benutzerkontos beim Durchsuchen Ihrer /usr/localOrdner, was ich an anderer Stelle empfohlen habe.


9

Unter Windows 7 können beispielsweise die folgenden Befehle / Vorgänge verwendet werden.

Erstellen Sie eine persönliche Umgebungsvariable. Doppelte Backslashes sind obligatorisch:

  • Variablennamen: %NPM_HOME%
  • Variabler Wert: C:\\SomeFolder\\SubFolder\\

Setzen Sie nun die Konfigurationswerte auf die neuen Ordner (beispielhafte Dateinamen):

  • Legen Sie den Ordner npm fest

npm config set prefix "%NPM_HOME%\\npm"

  • Legen Sie den Ordner npm-cache fest

npm config set cache "%NPM_HOME%\\npm-cache"

  • Legen Sie den temporären Ordner npm fest

npm config set tmp "%NPM_HOME%\\temp"

Optional können Sie den Inhalt der ursprünglichen Ordner löschen, bevor die Konfiguration geändert wird.

  • Löschen Sie den npm-Cache npm cache clear

  • Listen Sie die npm-Module auf npm -g ls

  • Löschen Sie die npm-Module npm -g rm name_of_package1 name_of_package2


1
Danke, ich folge den Schritten. Aber es erstellt ein Verzeichnis mit dem Namen c: /% NPM_HOME% / npm usw. anstelle von c: / npm_home / npm
Jay

6

Nachdem ich selbst danach gesucht hatte und wollte, dass mehrere Projekte mit gemeinsamen Abhängigkeiten trockener werden, habe ich Folgendes gefunden:

  • Die lokale Installation ist der Knotenweg für alles, über das Sie verwenden möchten require()
  • Die globale Installation ist für Binärdateien vorgesehen, die Sie in Ihrem Pfad haben möchten, ist jedoch für nichts über vorgesehen require()
  • Unter Verwendung eines Präfix Mittel Sie entsprechende hinzufügen müssen binund manWege zu$PATH
  • npm linkMit ( info ) können Sie eine lokale Installation als Quelle für Globals verwenden

→ Halten Sie sich an den Knotenweg und installieren Sie ihn lokal

ref:

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.