Geben Sie in package.json den Pfad zu node_modules an


91

Gibt es eine Möglichkeit, das Verzeichnis node_modules in einer Anwendung zu verschieben, um beispielsweise / vendor / node_modules zu verwenden, wie es bower mit der Datei bowerrc tut? Ich dachte, es könnte in package.json angegeben werden, aber ich kann anscheinend keine Lösung finden. Deine Hilfe ist sehr Willkommen.



@blunderboy danke für den Link. Es ist verrückt, dass es keinen einfacheren Weg gibt, dies zu tun. Naja.
Sturoid

24
Ich bin mir nicht sicher, warum Sie eine Antwort akzeptiert haben, die Ihre Frage eindeutig nicht beantwortet. Sie fragen, wie der Pfad auf node_modules in festgelegt werden sollpackage.json , und die Antwort von xShirase bietet einfach keine Möglichkeit, dies zu tun.
Mark Amery

4
Er hat die Antwort wahrscheinlich akzeptiert, weil dies ganz klar ein XY-Problem ist und eine alternative Lösung besser ist als "Entschuldigung, das ist nicht möglich."
Jake Holzinger

Antworten:


54

Ja, Sie können, setzen Sie einfach die env-Variable NODE_PATH:

export NODE_PATH='yourdir'/node_modules

Laut dem Dokument:

Wenn die Umgebungsvariable NODE_PATH auf eine durch Doppelpunkte getrennte Liste absoluter Pfade festgelegt ist, durchsucht der Knoten diese Pfade nach Modulen, wenn sie nicht an anderer Stelle gefunden werden. (Hinweis: Unter Windows wird NODE_PATH durch Semikolons anstelle von Doppelpunkten begrenzt.)

Darüber hinaus sucht der Knoten an folgenden Orten:

1: $ HOME / .node_modules

2: $ HOME / .node_libraries

3: $ PREFIX / lib / node

Dabei ist $ HOME das Home-Verzeichnis des Benutzers und $ PREFIX das konfigurierte node_prefix des Knotens.

Diese sind meist aus historischen Gründen. Es wird dringend empfohlen, Ihre Abhängigkeiten lokal in den Ordnern node_modules abzulegen. Sie werden schneller und zuverlässiger geladen.

Quelle


1
Das ist großartig. Würde ich in meinem Fall, in dem ich für jede Anwendung, die ich erstelle, lokale Knotenmodule habe, diesen Export in eine js-Datei im Projekt durchführen?
Sturoid

3
Nein, es ist eine Umgebungsvariable, es wird auf Systemebene eingerichtet. Sie müssen es also in Ihr Terminal eingeben. Auf env-Variablen wird innerhalb einer Knoten-App inprocess.env
xShirase

Hmmm hört sich gut an. Ich muss mich noch etwas darum kümmern. Danke für die Hilfe.
Sturoid

108
Ich glaube nicht, dass dies die Antwort auf die Frage ist: Er hat nach einer Eigenschaft in package.json gefragt, um einen Pfad für LOCAL (Anwendungsebene) npm-Packages zu erstellen. Diese Antwort sagt ihm, wie er die GLOBAL (-g) installierten Pakete in einen anderen Ordner verschieben kann.
David Losert

2
@IsmailIqbal Entschuldigung, ich habe gerade Ihren Kommentar gesehen. Es sind zwei Jahre in der NPM-Welt vergangen und wir haben einen ziemlichen Sprung mit Caching, Garn oder sogar npm5, Webpack gemacht ... Ich würde sagen, dass der Umgang mit node_module heutzutage viel besser ist. In Ihrem Fall würde ich einfach an allen Speicherorten eine "npm-Installation" durchführen. Da npm bereits installierte Pakete zwischenspeichert, entspricht dies dem manuellen Kopieren ohne Overhead.
David Losert

26

Kurz gesagt: Es ist nicht möglich und wird anscheinend nie unterstützt (siehe hier https://github.com/npm/npm/issues/775 ).

Es gibt einige hackige Workarounds bei der Verwendung der CLI- oder ENV-Variablen (siehe die aktuell ausgewählte Antwort), .npmrc-Config-Files oder npm link- was sie alle gemeinsam haben: Sie sind nie nur projektspezifisch, sondern immer eine Art von globalLösungen.

Für mich ist keine dieser Lösungen wirklich sauber, da Mitwirkende an Ihrem Projekt immer eine spezielle Konfiguration erstellen müssen oder über spezielle Kenntnisse verfügen müssen - sie können nicht einfach npm installund es funktioniert.

Also: Entweder müssen Sie Ihre package.json in dasselbe Verzeichnis stellen, in dem Ihre node_modules installiert werden sollen, oder Sie müssen damit leben, dass sie sich immer im Stammverzeichnis Ihres Projekts befinden.


15
"Wenn Sie" node_modules "anders buchstabieren möchten, ist dies leider nicht möglich. Dies ist in den Node-Core integriert. Eine Änderung ist gleichbedeutend mit der Erstellung eines völlig anderen Paketmanagers." <== gute Arbeit mit Variablen, denke ich.
Staubraun

Ein Kommentar von 2019: Es sieht so aus, als würde Garn das Überschreiben des Modulverzeichnisses unterstützen. Nun, Garn ist wohl ein neuer Paketmanager.
Vanuan

10

Garn unterstützt diese Funktion:

# .yarnrc file in project root
--modules-folder /node_modules

Ihre Erfahrung kann jedoch variieren, je nachdem, welche Pakete Sie verwenden. Ich bin mir nicht sicher, ob du in dieses Kaninchenloch gehen willst.


6

Ich bin mir nicht sicher, ob Sie dies im Sinn hatten, aber ich bin auf diese Frage gestoßen, weil ich nicht in node_modulesmeinem Projektverzeichnis installieren konnte, da es auf einem Dateisystem bereitgestellt war, das keine Symlinks unterstützte (ein "freigegebener" VM-Ordner ).

Ich habe die folgende Problemumgehung gefunden:

  1. Kopieren Sie die package.jsonDatei in einen temporären Ordner in einem anderen Dateisystem
  2. Lauf npm installdorthin
  3. Kopieren Sie das resultierende node_modulesVerzeichnis zurück in das Projektverzeichnis, cp -r --dereferenceum Symlinks zu Kopien zu erweitern.

Ich hoffe, dies hilft jemand anderem, der diese Frage beantwortet, wenn er nach einer Möglichkeit sucht, node_modulesin ein anderes Dateisystem zu wechseln .

Andere Optionen

Es gibt eine andere Problemumgehung, die ich bei dem Github-Problem gefunden habe, mit dem @Charminbear verknüpft ist. Dies funktioniert jedoch nicht, gruntda es NODE_PATHgemäß https://github.com/browserify/resolve/issues/136 nicht unterstützt wird :

Nehmen wir an, Sie haben /media/sf_sharedSymlinks und können dort keine Symlinks installieren. Dies bedeutet, dass Sie keine npm-Installation durchführen können, /media/sf_shared/myprojectda einige Module Symlinks verwenden.

  • $ mkdir /home/dan/myproject && cd /home/dan/myproject
  • $ ln -s /media/sf_shared/myproject/package.json (Sie können in diese Richtung einen Symlink erstellen, jedoch keinen in / media / sf_shared erstellen.)
  • $ npm install
  • $ cd /media/sf_shared/myproject
  • $ NODE_PATH=/home/dan/myproject/node_modules node index.js
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.