Globale NPM-Installation "Modul kann nicht gefunden werden"

206

Ich habe ein Modul geschrieben, das ich vor kurzem bei npm veröffentlicht habe (https://npmjs.org/package/wisp).

So wird es gut über die Kommandozeile installiert:

$ npm i -g wisp

Wenn ich es jedoch über die Befehlszeile ausführe, wird immer wieder die Fehlermeldung angezeigt, dass der Optimist nicht installiert ist:

$ wisp 
Error: Cannot find module 'optimist'
    at Function.Module._resolveFilename (module.js:338:15)
    at Function.Module._load (module.js:280:25)
    at Module.require (module.js:362:17)
    at require (module.js:378:17)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:12:10)
    at Object.<anonymous> (/usr/local/lib/node_modules/wisp/wisp:96:4)
    at Module._compile (module.js:449:26)
    at Object.exports.run (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/coffee-script.js:68:25)
    at compileScript (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:135:29)
    at fs.stat.notSources.(anonymous function) (/usr/local/lib/node_modules/coffee-script/lib/coffee-script/command.js:110:18)

Ich habe jedoch in package.json als Abhängigkeit angegeben:

{
  "name": "wisp",
  "author": "Brendan Scarvell <[email protected]>",
  "version": "0.1.0",
  "description": "Global nodejs file server",
  "dependencies": {
    "optimist": "~0.3.4"
  },
  "repository": "git://github.com/tehlulz/wisp",
  "bin": {
    "wisp" : "./wisp"
  }
}

Weiß jemand, was zu tun ist, um dies zum Laufen zu bringen? Ich weiß, dass es damit zu tun hat, dass der bin-Teil die ausführbare Datei zu bin hinzufügt und die node_modules in diesem Verzeichnis leer sind. Keine Ahnung, wie man das löst.

Menztrual
quelle
Was passiert, wenn Sie ohne die Option -g installieren?
Vinayr
Es installiert einen Ordner node_modules im aktuellen Verzeichnis, in dem sich wisp befindet.
Menztrual
Ich weiß. Erhalten Sie immer noch Fehler?
Vinayr
Ja. Wenn ich versuche, wisp auszuführen, nachdem ich ein lokales npm i wisp ausgeführt habe, wird immer noch der gleiche Fehler zurückgegeben
Menztrual
Ich habe gerade Ihr Modul installiert. Es funktioniert gut für mich. Wo ist dein Hauch? In meinem Fall bin ich gelaufen, ./node_modules/wisp/wispwas gut funktioniert.
Vinayr

Antworten:

369

Für alle anderen, die darauf stoßen, hatte ich dieses Problem aufgrund meiner npmInstallation an einem Ort, der sich nicht auf meinem befindet NODE_PATH.

[root@uberneek ~]# which npm
/opt/bin/npm
[root@uberneek ~]# which node
/opt/bin/node
[root@uberneek ~]# echo $NODE_PATH

Mein NODE_PATH war leer und das Ausführen npm install --global --verbose promised-iozeigte, dass es installiert wurde in /opt/lib/node_modules/promised-io:

[root@uberneek ~]# npm install --global --verbose promised-io
npm info it worked if it ends with ok
npm verb cli [ '/opt/bin/node',
npm verb cli   '/opt/bin/npm',
npm verb cli   'install',
npm verb cli   '--global',
npm verb cli   '--verbose',
npm verb cli   'promised-io' ]
npm info using npm@1.1.45
npm info using node@v0.8.4
[cut]
npm info build /opt/lib/node_modules/promised-io
npm verb from cache /opt/lib/node_modules/promised-io/package.json
npm verb linkStuff [ true, '/opt/lib/node_modules', true, '/opt/lib/node_modules' ]
[cut]

Mein Skript schlägt fehl am require('promised-io/promise'):

[neek@uberneek project]$ node buildscripts/stringsmerge.js 

module.js:340
    throw err;
          ^
Error: Cannot find module 'promised-io/promise'
    at Function.Module._resolveFilename (module.js:338:15)

Ich habe wahrscheinlich Node und Npm von der Quelle mit installiert configure --prefix=/opt. Ich habe keine Ahnung, warum sie dadurch nicht in der Lage sind, installierte Module zu finden. Die Korrektur für den Moment besteht darin, NODE_PATH auf das richtige Verzeichnis zu verweisen:

export NODE_PATH=/opt/lib/node_modules

Mein require('promised-io/promise')jetzt gelingt.

Neek
quelle
10
Wo soll dieser NODE_PATH gesetzt werden?
Sand
8
@sandy, wo Sie die Umgebungsvariable NODE_PATH festlegen, hängt von Ihrem Betriebssystem ab. Ich verwende eine Linux-Variante, daher habe ich export NODE_PATH=...sie in der lokalen Shell so festgelegt, dass sie in Befehle exportiert wird, die in dieser Shell ausgeführt werden. Um die Änderung dauerhaft oder für alle Shells verfügbar zu machen, legen Sie sie in .profile oder ähnlichem ab. Das Konzept als Ganzes ist für den Neuling ärgerlich komplex. Lesen Sie help.ubuntu.com/community/EnvironmentVariables . Für Windows möchten Sie zu Linux wechseln. OK, nur ein Scherz. Versuchen Sie es mit computerhope.com/issues/ch000549.htm oder googeln Sie es.
Neek
13
Für OSX Lion hat Folgendes für mich funktioniert ... export NODE_PATH = / usr / local / lib / node_modules Ich habe 'Locate Node_Modules' verwendet, um den richtigen Pfad zu finden.
k1eran
2
NODE_PATH funktioniert auch für WINDOWS. Dies ist darauf zurückzuführen, dass Knotenmodule sowohl lokal als auch global installiert werden können.
Zinking
5
Wenn Sie Node.js mit Homebrew unter Mac OS X installiert haben: open -a TextEdit ~/.bash_profileIn Terminal ausführen, fügen Sie export NODE_PATH=/usr/local/lib/node_moduleses am Ende der Datei hinzu. Starten Sie das Terminalfenster neu. Jetzt echo $NODE_PATHsollte das Laufen ausgedruckt werden /usr/local/lib/node_modules.
Pwdr
39

füge dies zum Anfang von prog (mac) hinzu:

module.paths.push('/usr/local/lib/node_modules');

Cando Zhou
quelle
4
Gibt es eine Möglichkeit, dies nicht spezifisch zu tun?
UpTheCreek
@UpTheCreek Dies ist ein nicht os-spezifischer Weg. Es ist JS-Code, Sie müssen nur auf ein node_modules zeigen, das das Modul enthält, nach dem Sie suchen
Adelin
@Adelin - Dies ist eine betriebssystemspezifische Lösung, da der Speicherort der globalen Knotenmodule betriebssystemspezifisch ist. Wenn Sie beispielsweise unter Windows entwickeln und Linux in der Produktion ausführen, ist dies keine großartige Lösung.
UpTheCreek
Das ist leicht zu überwinden. Sie können beispielsweise den Knotenpfad in einer env-Variablen speichern und den fest codierten Pfad durch os.environ.nodepath(etwas in dieser Richtung) ersetzen .
Adelin
Für macOS Mojave 10.14.6 muss der Export NODE_PATH = / usr / local / lib / knotenmodule / npm / knotenmodule zu ~ / bash_profile hinzugefügt werden. Dies ist maschinenunabhängiger, da der native .js-Code nicht betroffen ist.
Vwvan
16

Standardmäßig schaut der Knoten nicht in das / usr / local / lib / node_module, um globale Module zu laden. Informationen zum Laden des Moduls finden Sie unter http://nodejs.org/api/modules.html#modules_loading_from_the_global_folders

Entweder müssen Sie 1) das Modul / usr / local / lib / node_module zu NODE_PATH hinzufügen und exportieren oder 2) die installierten Knotenmodule nach / usr / local / lib / node kopieren. (Wie im Link zum Laden des Modulmoduls erläutert, sucht der Knoten in diesem Pfad und funktioniert.)

Zufälligkeit
quelle
10

Versuchen Sie für einige (wie mich), dass nichts anderes funktioniert hat, Folgendes:

brew cleanup
brew link node
brew uninstall node
brew install node

Hoffe es hilft jemandem :)

Wille
quelle
9

Der folgende generische Fix würde für jedes Modul gelten. Zum Beispiel mit request-promise.

Ersetzen

npm install request-promise --global

Mit

npm install request-promise --cli

gearbeitet ( Quelle ) und auch fürglobals undinherits

Versuchen Sie auch, die Umgebungsvariable festzulegen

NODE_PATH=%AppData%\npm\node_modules
Mohammed Zameer
quelle
8

Ich habe den "Optimist" -Modulfehler erhalten und habe gerade "npm install" durchgeführt, um ihn zu beheben. ging an diesem Fehler vorbei.

https://github.com/mbloch/mapshaper/issues/12

user2921139
quelle
3

$ vim /etc/profile.d/nodejs.sh

NODE_PATH=/usr/lib/nodejs:/usr/lib/node_modules:/usr/share/javascript
export NODE_PATH="$NODE_PATH"
user1959076
quelle
Das ist standardmäßig da. Für Benutzer ist es geladen, aber während es als Root ausgeführt wird, muss es nicht in den Pfad des Root-Benutzers aufgenommen werden.
Stamster
2

Unter Windows kann Nodejs unter Windows kein installiertes Modul finden? Was für mich funktioniert hat, ist npm Link wie in

npm link wisp
PM
quelle
Ein Wort der Vorsicht - ich habe dies getan, konnte dann aber meine Postleitzahl nicht mit AWS Lambda verwenden. Ich musste das node_module lokal wie in npm install wisp --save(ohne die Option -g) erstellen lassen
PM
2

Verwenden Sie für Mac-Benutzer am besten die manuelle Installation:

Um die Wahrscheinlichkeit von Berechtigungsfehlern zu minimieren, können Sie npm so konfigurieren, dass ein anderes Verzeichnis verwendet wird. In diesem Beispiel handelt es sich um ein verstecktes Verzeichnis in Ihrem Basisordner.

  1. Sichern Sie Ihren Computer, bevor Sie beginnen.

  2. Erstellen Sie ein Verzeichnis für globale Installationen:

    mkdir ~ / .npm-global

  3. Konfigurieren Sie npm für die Verwendung des neuen Verzeichnispfads:

    npm config set Präfix '~ / .npm-global'

  4. Öffnen oder erstellen Sie eine ~ / .profile-Datei und fügen Sie diese Zeile hinzu:

    export PATH = ~ / .npm-global / bin: $ PATH

  5. Aktualisieren Sie in der Befehlszeile Ihre Systemvariablen:

    Quelle ~ / .profile

  6. Test: Laden Sie ein Paket global herunter, ohne sudo zu verwenden.

    npm install -g jshint

Anstelle der Schritte 2 bis 4 können Sie die entsprechende ENV-Variable verwenden (z. B. wenn Sie ~ / .profile nicht ändern möchten):

NPM_CONFIG_PREFIX=~/.npm-global

Referenz: https://docs.npmjs.com/getting-started/fixing-npm-permissions

Shivansh Rajpoot
quelle
1

Hatte das gleiche Problem auf einem der Testserver Ubuntuunter root. Dann einen neuen Benutzer erstellt useradd -m myuserund installiert alles ( nvm, node, Pakete) , wie myuser. Jetzt funktioniert es gut.

Dmitriy
quelle
1

Wenn Sie unter Windows gerade eine Neuinstallation durchgeführt haben und diese erhalten, müssen Sie Ihren npm-Cache in \ AppData \ Roaming wegblasen

Dmitry
quelle
1

In meinem Fall waren beide nodeund npmauf dem gleichen Weg (/usr/bin ). Das NODE_PATHwar leer, also npmplatzierten die globalen Module dort, /usr/lib/node_moduleswo sie require(...)erfolgreich gefunden wurden. Die einzige Ausnahme war das npmModul, das mit dem Paket nodejs geliefert wurde. Da ich ein 64-Bit-System verwende, wurde es in platziert /usr/lib64/node_modules. Dies ist nicht der Ort, an dem (...) Suchen erforderlich sind, wenn der NODE_PATHKnoten leer ist und von dem aus gestartet wurde /usr/bin. Ich hatte also zwei Möglichkeiten:

  • Link /usr/lib64/node_modules/npmzu/usr/lib/node_modules/npm
  • Module von /usr/lib/node_modules/*nach verschieben /usr/lib64/node_modules/und einstellenNODE_PATH=/usr/lib64/node_modules

Beide haben funktioniert. Ich verwende OpenSUSE 42.1 und das Paket nodejs aus dem Update-Repository. Version ist 4.4.5.

GT.
quelle
1

Ich habe das auf einfache Weise gemacht ...

  1. Deinstallieren Sie den Knoten von der Systemsteuerung [Windows 7].
  2. Installieren Sie den Knoten erneut
  3. Installieren Sie den Winkelmesser. npm install --global --verbose protractor
    Aktualisieren Sie den Webtreiber-Manager.

funktioniert gut für mich.

Hoffe das hilft dir ....

santhosh v
quelle
1

Ich habe diesen Fehler bekommen Error: Cannot find module 'number-is-nan' während das Modul tatsächlich existiert. Dies lag an einer fehlerhaften / unvollständigen Installation von Node.js.

Für Windows benötigen Sie, wie andere Antworten vermuten lassen, eine saubere Node-Installation :

  • Deinstallieren Sie Node.js.
  • Löschen Sie die beiden Ordner npmund npm_cacheinC:\Users\user\AppData\Roaming
  • Starten Sie Windows neu und installieren Sie Node.js.
  • Führen Sie npm initoder ( npm init --yesfür die Standardkonfiguration) aus )
  • Legen Sie die Windows-Umgebungsvariable für fest NODE_PATH. In diesem Pfad werden Ihre Pakete installiert. Es ist wahrscheinlich so etwas wieNODE_PATH = C:\Users\user\node_modules or C:\Users\user\AppData\Roaming\npm\node_modules
  • Starten Sie eine neue Cmd-Konsole und npmsollte einwandfrei funktionieren

Hinweis :

Probieren Sie die letzten Punkte aus, bevor Sie Node.js neu installieren. Dies kann Ihnen Zeit sparen und eine Neuinstallation aller Pakete vermeiden.

alain.janinm
quelle
1

Ich habe gerade dieses Problem des axiosModuls getroffen. Dann habe ich folgendes versucht: rennen rm -rf node_modulesund yarn. Und es funktioniert.

Fein
quelle
0

Ich hatte den gleichen Fehler wie das OP, aber ich stöberte in den Protokollen, die ich sehen konnte sh: node: command not found.

Es stellt sich heraus, dass das Programm / usr / bin / node (symlink) nicht mehr mit installiert ist apt install nodejs. Einmal symlinked /usr/bin/node' tonodejs, npm install -g @ angle / cli` erfolgreich war.

Der richtige Weg, dies auf Debian zu installieren, ist apt install nodejs-legacy.

Mike
quelle
0

Ich musste C: \ Users \ {Benutzername} \ AppData \ Roaming \ npm zu meinen env-Variablen hinzufügen und dann konnte ich Sachen installieren.

Rainhider
quelle