Come importare i moduli globali in Node? Viene visualizzato il messaggio "Errore: impossibile trovare il modulo <modulo>"?


145

Sto cercando di configurare Node su Mac OSX Lion. Tutto sembra funzionare bene, ma non riesco a importare nulla moduli dalla mia cartella di moduli globali. Ottengo l'errore

Error: Cannot find module <module>

Se eseguo questo node -e require.paths:, la risposta che ottengo è:

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

Il che è corretto, i miei moduli sono effettivamente installati in / usr / local / lib / node_modules. Quando provo ad eseguire uno script, tuttavia, ottengo questo:

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)

Il mio .bash_profile è simile al seguente:

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/"

Gradirei davvero un po 'di aiuto, non ho idea del perché non riesco a importare alcuna libreria.


1
Sai che questo non è esattamente il modo preferito di fare le cose, giusto?
thejh

1
Potresti elaborare? Vuoi dire che non dovrei installare librerie nella mia cartella globale?
Hanpan,

3
@Hanpan: il modo preferito è installare i moduli che si desidera utilizzare tramite richiedono () localmente.
thejh

1
Una risposta migliore e più aggiornata (che non si basa su npm link) è disponibile qui: stackoverflow.com/a/15646750/2671392
GGG

1
Sono vecchia scuola e abituato a installare biblioteche in sedi globali. Non ho mai visto alcun motivo convincente per un uso pesante delle installazioni di librerie locali. La classe di mongodb che sto prendendo finirà con circa un centinaio di piccoli progetti quando avremo finito, ognuno contenente un set di librerie per lo più duplicato - mongodb, express, consolidate, ecc. Il passaggio a linguaggi interattivi lascia depositi delle biblioteche locali dappertutto. Devo avere migliaia di librerie Scala nei repository Scala locali. Idem Meteor, groovy e ruby.
Stephen W. Wright,

Risposte:


116

Se si utilizza npm> = 1.0, è possibile utilizzare npm link <global-package>per creare un collegamento locale a un pacchetto già installato a livello globale. ( Avvertenza: il sistema operativo deve supportare i collegamenti simbolici. )

Tuttavia, questo non viene senza i suoi problemi.

npm link è uno strumento di sviluppo. È fantastico per la gestione dei pacchetti sulla tua casella di sviluppo locale. Ma la distribuzione con npm link richiede fondamentalmente problemi, poiché rende semplicissimo aggiornare le cose senza accorgersene.

In alternativa, è possibile installare i pacchetti a livello locale e globale.

Per ulteriori informazioni, vedere


69
Sto leggendo questo e non posso credere ai miei occhi. Quindi se installo, diciamo express, e poi ho 20 progetti da compilare su express, devo installarlo 20 volte, per ognuno di essi, in ogni cartella del progetto, ancora e ancora? Non ho molta esperienza con i gestori di pacchetti, ma questo fa schifo ...
Treznik,

25
È corretto, e se ci pensate, ha senso. La gestione locale delle dipendenze rende tutto autonomo e consente di specificare una versione specifica di una dipendenza per un determinato progetto (ad esempio, il progetto foo richiede express 2.x, mentre la barra del progetto può utilizzare express 3 beta).
Grahamb,

43
Ho faticato a capire la logica anche per un po ', ma dopo aver visto i miei amici di Ruby lottare con gli aggiornamenti dei pacchetti globali, discutere sui gemset e spesso semplicemente non aggiornare, ho ammesso che installare le dipendenze localmente è assolutamente l'unico modo sano di fare gestione del pacchetto .
Timoxley,

3
Vorrei tracciare un parallelo tra questa situazione e quella delle librerie con collegamento statico e collegamento dinamico in relazione alla distribuzione del software. Considera che quasi tutte le app distribuite sull'App Store di iOS devono collegare staticamente dipendenze non fornite dall'SDK di iOS. Perché è fatto? L'inferno della dipendenza globale è una cosa molto reale.
Steven Lu,

1
Comprendo anche che npmla cache (che risiede ~/.npm) renderà conveniente il processo di reinstallazione eseguito nelle diverse posizioni.
Steven Lu,

85

Node.js utilizza la variabile ambientale NODE_PATHper consentire di specificare ulteriori directory da includere nel percorso di ricerca del modulo. Puoi usarlo npmper dirti dove sono memorizzati i moduli globali con il npm root -gcomando. Quindi, unendo questi due, puoi assicurarti che i moduli globali siano inclusi nel tuo percorso di ricerca con il seguente comando (su Linux-ish)

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


3
Grazie per il NODE_PATHsuggerimento variabile d'ambiente. Ciò ha aiutato molto!
rekire il

7
Questo dovrebbe essere il commento principale
Adam Prax,

Ho dovuto impostare NODE_PATHil percorso posix equivalente per far funzionare npm su MSYS2. Grazie.
Joyce Babu,

Funziona anche con Windows e Git Bash. Perfetto. :-)
inf3rno

Questo rende la tua .node_modulescartella ricercabile, ma per importare i moduli usando require(), dovrebbero comunque essere installati nella directory del tuo progetto locale (o, in alternativa, collegati usando npm link). I moduli globali non possono essere importati nei progetti, da lì è possibile eseguire solo binari / script.
Prahlad Yeri,

65

È possibile utilizzare il collegamento npm per creare un collegamento simbolico al pacchetto globale nella cartella dei progetti.

Esempio:

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

Tutto ciò che fa è creare una cartella node_modules locale e quindi creare un symlink express -> [directory globale] / node_modules / express che può quindi essere risolto da require('express')


Questo cross-OS è compatibile?
UpTheCreek,

Le versioni più recenti di Windows lo supportano da questa versione: github.com/npm/npm/commit/… Per le versioni precedenti di Windows prova npmjs.com/package/npm-junction
Alex

22

Installa qualsiasi pacchetto a livello globale come di seguito:

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

Dato che questo modulo di sostituzione è installato a livello globale, quindi se vedi la cartella dei moduli del nodo non vedresti lì sostituire il modulo e quindi non puoi usare questo pacchetto usando request ('sostituisci').

perché con un requisito è possibile utilizzare solo i moduli locali presenti nella cartella del modulo del nodo.

Ora per usare il modulo globale dovresti collegarlo al percorso del modulo nodo usando il comando seguente.

$ npm link replace

Ora torna indietro e visualizza la cartella del tuo modulo di nodo, ora potresti essere in grado di vedere lì il modulo di sostituzione e puoi usarlo con request ('sostituisci') nella tua applicazione in quanto è collegato al tuo modulo di nodo locale.

Fammi sapere se sono necessari ulteriori chiarimenti.


14

È possibile utilizzare request con il percorso della directory del modulo globale come argomento.

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

Sul mio Mac, utilizzo questo:

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

Come trovare dove sono i tuoi moduli globali? -> Dove installa i pacchetti npm?


7

Impostare la variabile di ambiente NODE_PATH in modo che punti al proprio globale node_modules cartella .

In Windows 7 o versioni successive il percorso è simile a %AppData%\npm\node_modulesmentre in UNIX potrebbe essere qualcosa di simile/home/sg/.npm_global/lib/node_modules/ ma dipende dalla configurazione dell'utente.

Il comando npm config get prefix potrebbe aiutare a scoprire qual è il percorso corretto.

Nei sistemi UNIX è possibile eseguirlo con il seguente comando:

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

0

Sto usando Docker. Sto provando a creare un'immagine docker in cui sono installate tutte le dipendenze del mio nodo, ma può utilizzare la mia directory dell'app locale durante l'esecuzione del contenitore (senza inquinarla con una directory o un collegamento node_modules). Ciò causa problemi in questo scenario. La mia soluzione alternativa è richiedere dal percorso esatto in cui il modulo, ad esempio, richiede ('/ usr / local / lib / node_modules / socket.io')


-1

require.paths è deprecato.

Vai alla cartella del tuo progetto e digita

npm install socket.io

che dovrebbe installarlo nella cartella locale ./node_modules in cui il nodo lo cercherà.

Tengo le mie cose in questo modo:

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

Crea un file app.js

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

ora esegui la mia app

node app.js

Assicurati di utilizzare npm >= 1.0e node >= 4.0.


8
Chiede di usare pacchetti npm installati a livello globale.
UpTheCreek,

@Jamund. Stai mostrando come usare un pacchetto installato localmente, ma la domanda originale era su quelli globali.
Vitaliy Markitanov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.