Wie importiere ich globale Module in Node? Ich erhalte die Meldung "Fehler: Modul <Modul> kann nicht gefunden werden".


145

Ich versuche, Node unter Mac OSX Lion einzurichten. Es scheint alles in Ordnung zu sein, aber ich kann anscheinend keine Module aus meinem globalen Modulordner importieren. Ich bekomme den Fehler,

Error: Cannot find module <module>

Wenn ich Folgendes ausführe : node -e require.paths, erhalte ich folgende Antwort:

[ '/usr/local/lib/node_modules',
  '/Users/Me/.node_modules',
  '/Users/Me/.node_libraries',
  '/usr/local/Cellar/node/0.4.12/lib/node' ]

Was richtig ist, meine Module sind tatsächlich in / usr / local / lib / node_modules installiert. Wenn ich jedoch versuche, ein Skript auszuführen, erhalte ich Folgendes:

Error: Cannot find module 'socket.io'
    at Function._resolveFilename (module.js:326:11)
    at Function._load (module.js:271:25)
    at require (module.js:355:19)
    at Object.<anonymous> (/Users/Me/node/server.js:2:10)
    at Module._compile (module.js:411:26)
    at Object..js (module.js:417:10)
    at Module.load (module.js:343:31)
    at Function._load (module.js:302:12)
    at Array.<anonymous> (module.js:430:10)
    at EventEmitter._tickCallback (node.js:126:26)

Mein .bash_profile sieht folgendermaßen aus:

export PATH=/usr/local/mysql/bin:$PATH
export NODE_PATH=/usr/local/lib/node_modules
export DYLD_LIBRARY_PATH="$DYLD_LIBRARY_PATH:/usr/local/mysql/lib/"

Würde mich sehr über Hilfe freuen, ich habe keine Ahnung, warum ich keine Bibliotheken importieren kann.


1
Sie wissen, dass dies nicht gerade die bevorzugte Art ist, Dinge zu tun, oder?
thejh

1
Könnten Sie näher darauf eingehen? Meinen Sie damit, dass ich keine Bibliotheken in meinem globalen Ordner installieren sollte?
Hanpan

3
@ Hanpan: Die bevorzugte Methode besteht darin, Module, die Sie über require () verwenden möchten, lokal zu installieren.
thejh

1
Eine bessere und aktuellere Antwort (auf die Sie sich nicht verlassen npm linkkönnen) finden Sie hier: stackoverflow.com/a/15646750/2671392
GGG

1
Ich bin altmodisch und daran gewöhnt, Bibliotheken an globalen Standorten zu installieren. Ich habe noch nie einen überzeugenden Grund für eine starke Nutzung lokaler Bibliotheksinstallationen gesehen. Die Mongodb-Klasse, an der ich teilnehme, wird bis zu unserem Abschluss ungefähr hundert kleine Projekte haben, von denen jedes einen größtenteils doppelten Satz von Bibliotheken enthält - Mongodb, Express, Konsolidierung usw. Die Umstellung auf interaktive Sprachen hinterlässt Ablagerungen von lokalen Bibliotheken überall. Ich muss Tausende von Scala-Bibliotheken in den lokalen Scala-Repositories haben. Das Gleiche gilt für Meteor, groovig und rubinrot.
Stephen W. Wright

Antworten:


116

Wenn Sie npm> = 1.0 verwenden, können Sie npm link <global-package>einen lokalen Link zu einem bereits global installierten Paket erstellen. ( Vorsichtsmaßnahme: Das Betriebssystem muss Symlinks unterstützen. )

Dies ist jedoch nicht ohne Probleme.

npm link ist ein Entwicklungswerkzeug. Es ist fantastisch, um Pakete auf Ihrer lokalen Entwicklungsbox zu verwalten. Die Bereitstellung mit npm link stellt jedoch grundsätzlich Probleme dar, da es sehr einfach ist, Dinge zu aktualisieren, ohne es zu merken.

Alternativ können Sie die Pakete sowohl lokal als auch global installieren.

Weitere Informationen finden Sie unter


69
Ich lese das und kann meinen Augen nicht trauen. Wenn ich also Express installiere, z. B. Express, und dann 20 Projekte auf Express aufbauen muss, muss ich es 20 Mal für jedes von ihnen in jedem Projektordner immer und immer wieder installieren? Ich habe nicht viel Erfahrung mit Paketmanagern, aber das ist irgendwie
scheiße

25
Das ist richtig, und wenn Sie darüber nachdenken, macht es Sinn. Durch das lokale Verwalten Ihrer Abhängigkeiten bleibt alles in sich geschlossen und Sie können eine bestimmte Version einer Abhängigkeit für ein bestimmtes Projekt angeben (z. B. erfordert Projekt foo Express 2.x, während die Projektleiste die Express 3-Beta verwenden kann).
Grahamb

43
Ich hatte auch eine Weile Mühe, die Logik zu verstehen, aber nachdem ich gesehen hatte, wie meine Ruby-Freunde mit globalen Paketaktualisierungen kämpften, über Gemsets stritten und oft einfach nie ein Upgrade durchführten, habe ich eingeräumt, dass die lokale Installation von Abhängigkeiten absolut der einzig vernünftige Weg ist Paketverwaltung .
Timoxley

3
Ich möchte eine Parallele zwischen dieser Situation und der von Bibliotheken mit statischer Verknüpfung und Bibliotheken mit dynamischer Verknüpfung ziehen, wenn es um die Verteilung von Software geht. Beachten Sie, dass fast alle im iOS App Store vertriebenen Apps Abhängigkeiten statisch verknüpfen müssen, die nicht vom iOS SDK bereitgestellt werden. Warum wird das gemacht? Die Hölle der globalen Abhängigkeit ist eine sehr reale Sache.
Steven Lu

1
Ich verstehe auch, dass npmder Cache (in dem sich der Cache befindet ~/.npm) den Neuinstallationsprozess an Ihren verschiedenen Standorten zweckmäßig macht.
Steven Lu

85

Node.js verwendet die Umgebungsvariable NODE_PATH, um zusätzliche Verzeichnisse anzugeben, die in den Modul-Suchpfad aufgenommen werden sollen. npmMit dem npm root -gBefehl können Sie selbst angeben, wo globale Module gespeichert sind . Wenn Sie diese beiden zusammenfügen, können Sie mit dem folgenden Befehl sicherstellen, dass globale Module in Ihrem Suchpfad enthalten sind (unter Linux).

export NODE_PATH=$(npm root --quiet -g)


3
Vielen Dank für den NODE_PATHHinweis auf die Umgebungsvariable. Das hat sehr geholfen!
rekire

7
Dies sollte der Top-Kommentar sein
Adam Prax

Ich musste NODE_PATHden entsprechenden Posix-Pfad festlegen, damit npm unter MSYS2 funktioniert. Danke dir.
Joyce Babu

Funktioniert auch mit Windows und Git Bash. Perfekt. :-)
inf3rno

Dies macht Ihren .node_modulesOrdner durchsuchbar, aber um Module mit zu importieren require(), sollten sie weiterhin in Ihrem lokalen Projektverzeichnis installiert sein (oder alternativ mit verknüpft werden npm link). Globale Module können nicht in Projekte importiert werden, nur Binärdateien / Skripte können von dort ausgeführt werden.
Prahlad Yeri

65

Mit dem Link npm können Sie einen symbolischen Link zu Ihrem globalen Paket in Ihrem Projektordner erstellen.

Beispiel:

$ npm install -g express
$ cd [local path]/project
$ npm link express

Es wird lediglich ein lokaler Ordner "node_modules" erstellt und anschließend ein Symlink express -> [globales Verzeichnis] ​​/ node_modules / express erstellt, das dann von aufgelöst werden kann require('express')


Ist das OS-kompatibel?
UpTheCreek

Neuere Windows-Versionen unterstützen dies seit dieser Version: github.com/npm/npm/commit/… Für ältere Windows-Versionen versuchen Sie npmjs.com/package/npm-junction
Alex

22

Installieren Sie jedes Paket global wie folgt:

$ npm install -g replace  // replace is one of the node module.

Da dieses Ersetzungsmodul global installiert ist, wird dort, wenn Sie Ihren Knotenmodulordner sehen, das Ersetzungsmodul dort nicht angezeigt, und Sie können dieses Paket nicht mit require ('replace') verwenden.

denn mit require können Sie nur lokale Module verwenden, die in Ihrem Knotenmodulordner vorhanden sind.

Um nun ein globales Modul zu verwenden, sollten Sie es mit dem folgenden Befehl mit dem Pfad des Knotenmoduls verknüpfen.

$ npm link replace

Gehen Sie jetzt zurück und sehen Sie sich Ihren Knotenmodulordner an. Möglicherweise können Sie dort das Ersatzmodul sehen und es mit require ('replace') in Ihrer Anwendung verwenden, da es mit Ihrem lokalen Knotenmodul verknüpft ist.

Bitte lassen Sie mich wissen, wenn weitere Klarstellungen erforderlich sind.


14

Sie können require mit dem Pfad zum globalen Modulverzeichnis als Argument verwenden.

require('/path/to/global/node_modules/the_module');

Auf meinem Mac verwende ich Folgendes:

require('/usr/local/lib/node_modules/the_module');

Wie finden Sie heraus, wo sich Ihre globalen Module befinden? -> Wo installiert npm Pakete?


7

Festlegen der Umgebungsvariablen NODE_PATH, die auf Ihren globalen node_modulesOrdner verweist .

In Windows 7 oder höher ist der Pfad so ähnlich wie %AppData%\npm\node_modulesunter UNIX, /home/sg/.npm_global/lib/node_modules/aber er hängt von der Benutzerkonfiguration ab.

Der Befehl npm config get prefix kann helfen, herauszufinden, welcher Pfad der richtige ist.

In UNIX-Systemen können Sie dies mit dem folgenden Befehl ausführen:

export NODE_PATH=`npm config get prefix`/lib/node_modules/

0

Ich benutze Docker. Ich versuche, ein Docker-Image zu erstellen, in dem alle meine Knotenabhängigkeiten installiert sind, das jedoch zur Laufzeit des Containers mein lokales App-Verzeichnis verwenden kann (ohne es mit einem node_modules-Verzeichnis oder -Link zu verschmutzen). Dies führt in diesem Szenario zu Problemen. Meine Problemumgehung besteht darin, von dem genauen Pfad aus zu verlangen, in dem sich das Modul befindet, z. B. ('/ usr / local / lib / node_modules / socket.io').


-1

require.paths ist veraltet.

Gehen Sie zu Ihrem Projektordner und geben Sie ein

npm install socket.io

Das sollte es im lokalen Ordner ./node_modules installieren, in dem der Knoten danach sucht.

Ich behalte meine Sachen so:

cd ~/Sites/
mkdir sweetnodeproject
cd sweetnodeproject
npm install socket.io

Erstellen Sie eine app.js-Datei

// app.js
var socket = require('socket.io')

Jetzt starte meine App

node app.js

Stellen Sie sicher, dass Sie npm >= 1.0und verwenden node >= 4.0.


8
Er fragt nach der Verwendung global installierter npm-Pakete.
UpTheCreek

@ Jamund. Sie zeigen, wie lokal installierte Pakete verwendet werden, aber die ursprüngliche Frage betraf globale.
Vitaliy Markitanov
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.