2015-12-27 34 views
6

Qualcuno può spiegare come si comportano i nodi installati globalmente. Mi sta davvero confondendo. Se installo un pacchetto (con eseguibili), come http-server globalmente posso eseguirlo con:Esecuzione di pacchetti NPM installati a livello globale

http-server 

Ma se faccio

node http-server 

ottengo

module.js:339 
    throw err; 
    ^

Error: Cannot find module '/path/to/current/dir/http-server' 
    at Function.Module._resolveFilename (module.js:337:15) 
    at Function.Module._load (module.js:287:25) 
    at Function.Module.runMain (module.js:457:10) 
    at startup (node.js:136:18) 
    at node.js:972:3 

Ho il sospetto che il mio tern pacchetto in emacs sta cercando di eseguirlo con node quindi rottura. Perché sta succedendo? Perché il nodo non può trovare il percorso per i propri moduli?

risposta

2
[email protected]:~$ node blalal 
module.js:338 
throw err; 
^ 

Error: Cannot find module '/home/rahul/blalal' 
at Function.Module._resolveFilename (module.js:336:15) 
at Function.Module._load (module.js:286:25) 
at Function.Module.runMain (module.js:475:10) 
at startup (node.js:117:18) 
at node.js:951:3 

ooh stesso errore

questo è perché io primo comando in realtà si sta cercando di accedere a una variabile globale, ma nel secondo si sono alcuni dove nella gerarchia dei file e da lì si sta dicendo che si desidera accesso che pacchetto in modo vi sbagliate se si desidera eseguire il pacchetto globale provare

whereis http-server 

poi andare a quella directory e trovare il file package.json e poi aprirlo e trovare la proprietà "principale" e non ci si arriva un nome di file quindi digitare

node index.js 

verrà eseguito il file

0

Quando si installa qualcosa globalmente, si memorizza una variabile con un percorso memorizzato che si collega ad esso e il programma di esecuzione. Mentre il tuo sistema operativo saprà come accedervi. Nodo non lo farà. Se si desidera "node something.js", si può trovarsi nella directory o regolare il percorso in modo che il nodo sappia come arrivare al file. per esempio il nodo "c: /jsapps/main/app.js" o se ci si trova nella cartella "jsapps", digitare il nodo "main/app.js" per eseguire lo stesso file.

3

Ci sono due modi per installare i pacchetti: globally e locally.
Locally i file di pacchetto installati finiscono nel vostro locale node_modules (nella cartella del progetto in cui è stato chiamato npm install some-package).
Globalmente file dei pacchetti installati finiscono nel vostro sistema in modo che siano disponibili in linea di comando, se i pacchetti installati a livello globale fornisce eseguibile allora si può invocarlo in linea di comando direttamente some-package (senza node), se non fornisce eseguibile allora si può usarlo in modalità repl (node) come var package = require('some-package') ed è anche disponibile localmente (all'interno della cartella del progetto anche se non è installato localmente).

2

Questo è iniziato come un commento, ma ora ha un po 'di più.

Il problema non è esattamente node non trovare pacchetti globali, node ricerca solo per i pacchetti nella posizione corrente (come sotto sotto node_modules), e che è di progettazione. I pacchetti installati a livello globale possono essere eseguiti dal comando come per il modo in cui li installa npm, e questo è ciò che rende speciali i pacchetti globali in qualche modo.

Su sistemi basati su Unix, npm crea collegamenti software per i file eseguibili principali di pacchetti installati globalmente, come http-server in una cartella nel percorso dell'eseguibile. Sulla mia macchina, questo è /usr/local/bin/. Questo è il motivo per cui questi comandi possono essere richiamati dalla riga di comando senza specificare un percorso completo.

Su Windows, npm crea un file batch eseguibile denominato per esempio http-server.cmd sotto %APPDATA% (in genere qualcosa come C:\Users\YourUserName\AppData\Roaming). Il file batch contiene le istruzioni per eseguire il file eseguibile di destinazione dalla posizione in cui è effettivamente installato.

+0

Ma perché non posso li corro con 'nodo [nome-pacchetto]'? Alcuni pacchetti (pacchetti emacs) cercano di eseguire questi pacchetti con il prefisso 'node' che è la parte confusa – Arijoon

+0

@Arijoon Probabilmente perché questi pacchetti si aspettano di trovare le loro dipendenze installate localmente. –

+0

ok come posso assicurarmi che trovino le loro dipendenze globalmente? Dal momento che se installo lo stesso pacchetto localmente, non funzionerà ancora con 'node [nome-pacchetto]' – Arijoon

Problemi correlati