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 ...
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? –
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. –
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? –