2012-09-25 16 views
6

La documentazione NPM dice questo:Accesso a un modulo globale node.js

  • Se si sta installando qualcosa che si desidera utilizzare nel programma, utilizzando richiedono ('qualunque cosa'), quindi installare localmente, alla base del tuo progetto.
  • Se si sta installando qualcosa che si desidera utilizzare nella shell, nella riga di comando o su qualcosa, installarlo globalmente, in modo che i suoi file binari finiscano nella variabile di ambiente PATH.

Attualmente sto scrivendo --- o, almeno, cercando di scrivere --- un vero e proprio programma a riga di comando nel nodo che è destinato ad essere utilizzato dalla shell. Pertanto, secondo quanto sopra, le mie dipendenze dovrebbero essere installate come moduli globali.

In che modo posso utilizzare un modulo globale installato con npm nel nodo? Chiamare require() non funziona, ovviamente, perché la directory del modulo globale npm (/usr/local/lib/node_modules) non si trova sul percorso per impostazione predefinita. Posso farlo funzionare aggiungendolo esplicitamente al percorso nella parte superiore del mio programma, ma questa è una soluzione davvero pessima perché non è portabile --- richiede la conoscenza di dove la directory del modulo globale di npm si trova su un dato sistema.

Solo per rendere la vita ancora più aggravante, ho alcuni moduli globali installati tramite dpkg. Questi sono stati inseriti in /usr/lib/nodejs e funzionano. Questo mi confonde, perché se non si suppone che i moduli globali siano usati per le normali applicazioni, non mi aspetterei di essere sul percorso; altrimenti mi aspetterei che entrambi siano sulla strada e richiedano moduli globali per funzionare ovunque. Avere uno ma non l'altro sembra molto strano. Cosa sta succedendo qui?

Aggiornamento: Devo sottolineare che questo programma è solo uno script, con #!/usr/bin/env nodejs nella parte superiore; non è un modulo nodo formale, che è un modo eccessivo per qualcosa di abbastanza banale. Dato che i moduli Debian sono tutti quanti necessari da tale script, mi sembra ragionevole che anche i moduli globali di npm debbano essere necessari, ma ho la sensazione che questo sia un Debianismo ...

risposta

1

Quindi le istruzioni che si riferiscono a moduli npm, ma stai facendo lo sviluppo locale. Ecco alcune linee guida.

In termini di codice sorgente, avete solo bisogno di 2 tipi di require dichiarazioni

var dep = require('somedep') 

utilizzare questo per eventuali moduli di base (come fs) e terzi Moduli vostre esigenze di libreria che si sta anche via NPM (elencandoli nel pacchetto package.json come dipendenze). Qui si specifica un nome di pacchetto non qualificato e il nodo trova il modulo in base al suo algoritmo di ricerca.

var mymod = require('./lib/mymod') 

Utilizzare questo per richiedere gli altri moduli del progetto stesso per percorso relativo al file javascript corrente.

Questo è tutto ciò che dovete fare per gestire le vostre dipendenze javascript.

OK, ora come installate le vostre dipendenze?

per lo sviluppo locale (all'interno dell'albero dei sorgenti del progetto), solo cd nella directory del progetto ed eseguire npm install, che leggere il file package.json e installare i moduli necessari nel node_modules sottodirectory e tutto andrà bene per lo sviluppo locale.

Se si dovesse pubblicare questo modulo come npm, altri utenti (e si può essere sia lo sviluppatore che uno degli "altri utenti"), potrebbero installarlo con npm -g se volessero accedere alle utilità binarie del progetto. sul loro PATH che dovrebbe includere /usr/lib/nodejs/lib/node_modules, ma in tal caso, lo npm -g gestirà l'installazione sia del codice che delle dipendenze del progetto contemporaneamente.

Ecco dove ti stai confondendo.

Pertanto, in base a quanto sopra, le mie dipendenze devono essere installate come moduli globali.

Non è necessario installare esplicitamente le dipendenze come globali, solo il modulo di livello superiore che ti interessa, che in questo caso è il vostro progetto stesso. npm gestirà le dipendenze automaticamente, che è il suo scopo principale nella vita. Le dipendenze del progetto non verranno installate globalmente per dire, ma piuttosto nella sottodirectory node_modules del progetto, che verrà installata a livello globale.

Ecco le directory e quello che vive lì:

  • ~/yourproject: sviluppo locale per il vostro codice sorgente
  • ~/yourproject/node_modules: moduli NPM usati dal progetto durante lo sviluppo. Creato/popolato da corsa npm install in ~/yourproject
  • /usr/lib/nodejs/lib/node_modules: moduli NPM (che potrebbe eventualmente includere ProgettoUtente se si pubblica al Registro di sistema NPM) che vengono installati a livello globale
  • /usr/lib/nodejs/lib/node_modules/yourproject/node_modules: dipendenze del vostro progetto otterrà installato qui quando si fa npm install -g yourproject

È inoltre possibile trovare lo my blog post on managing interpreters and the PATH pertinente.

+0

Sì, ma questo si applica solo ai progetti pesanti, che non è così: questo è, in effetti, uno script di shell, un file sorgente con '#!/Usr/bin/env nodejs' in alto. Rimarrà bloccato in/usr/local/bin' per gli altri utenti della macchina. Costringere gli utenti a creare una directory di progetto locale solo per poterli eseguire è irragionevole. Dato che lo script può già arrivare ai moduli globali di Debian con 'require()', perché non riesco ad arrivare a npm? –

+0

Stai confondendo gli utenti con gli sviluppatori. Per gli utenti, pubblichi il tuo modulo sul registro di npm e gli utenti digitino semplicemente "npm install -g yourproject" e sono fatti. Se contrassegni il wrapper dello shell shell come un binario nel pacchetto package.json (vedi 'npm help json'), npm lo metterà nel posto giusto in modo che gli utenti possano eseguirlo. –

+0

Ma non ho un modulo, questo è il mio punto. Non c'è package.json e nessun wrapper di shell shell. So che non ho bisogno di avere un modulo per farlo perché se sto cercando di accedere ai moduli del nodo che Debian ha installato tutto funziona. Sono solo npm che non funzionano. Comincio a sospettare che npm non supporti questo caso d'uso e che Debian abbia manipolato la loro installazione del nodo per farlo funzionare esplicitamente. Questo sembra plausibile? –

4

Pertanto, in base a quanto sopra, le mie dipendenze devono essere installate come moduli globali.

Non proprio.

significava che il modulo potrebbe essere installato come un globale per cui il suo binaries sarebbe disponibile dalla shell:

npm install -g your-module 
your-module-binary --option etc. 

sue dipendenze, d'altra parte, deve essere installato a seguito del 1 ° punto, risiede in una directory node_modules all'interno del progetto (generalmente specificata in un package.json quindi npm può gestirli).

Tuttavia, i moduli globali non sono (normalmente) disponibili per require.Non seguono Loading from node_modules folders, che segue per i moduli locali npm e il loro percorso non è in genere elencato nella variabile NODE_PATH per Loading from global folders.

Problemi correlati