2015-02-25 14 views
6

Se sto sviluppando il pacchetto NPM foo e voglio che sia installato a livello mondiale come un'applicazione a riga di comando, posso farlo semplicemente aggiungendo alla mia package.json:Perché l'esecuzione del mio pacchetto collegato a livello globale npm apre semplicemente il file bin?

"bin": { 
    "foo": "./bin/foo.js" 
} 

Qualcuno che installa il mio il pacchetto globalmente via npm avrà il file batch appropriato e lo script di shell aggiunto alla loro directory globale prefisso npm. Tuttavia, supponiamo di voler avviare il mio pacchetto dalla shell (o, nel caso di Windows, il prompt dei comandi). Potrei farlo creando uno script batch file/shell da qualche parte in una delle mie directory PATH che esegue semplicemente direttamente il mio pacchetto, ad es. @node C:\my\package\directory\bin\foo %*.

Questa è una soluzione abbastanza semplice ed evidente, ma ho ritenuto che npm link fosse più adatto, in quanto si sente meno hacky ed è teoricamente progettato per fare esattamente questa cosa. Corro npm link nella mia directory dei pacchetti, quindi eseguo il test eseguendo foo dalla riga di comando. Invece di eseguire il mio script, lo foo.js viene effettivamente aperto nel mio editor predefinito. Indagare nella directory di prefisso, si scopre che il file foo.cmd (il contenuto dello script foo shell sono simili), che NPM creato contiene questo:

"%~dp0\node_modules\foo\bin\foo.js" %* 

confrontare con il file batch creato da npm install -g:

@IF EXIST "%~dp0\node.exe" (
    "%~dp0\node.exe" "%~dp0\node_modules\npm\bin\npm-cli.js" %* 
) ELSE (
    @SETLOCAL 
    @SET PATHEXT=%PATHEXT:;.JS;=;% 
    node "%~dp0\node_modules\npm\bin\npm-cli.js" %* 
) 

Perché lo npm link produce file di script che lanciano un file bin del pacchetto anziché avviare il nodo con il file bin come argomento? Come posso risolvere questo comportamento?

+0

qualsiasi soluzione per questo? – kingPuppy

risposta

0

Quale versione di npm stai utilizzando? L'ultima è la 2.6.0, di recente sono stati apportati molti miglioramenti a npm, in particolare per quanto riguarda i conflitti e le condizioni di gara durante l'installazione. Puoi provare ad aggiornare l'installazione di npm?

Per aggiornare NPM su Windows, seguire le istruzioni qui: https://github.com/npm/npm/wiki/Troubleshooting#upgrading-on-windows

+0

In base a 'npm --version', eseguo 2.6.1. Non ho idea di come sia possibile, dato che il pacchetto [afferma piuttosto chiaramente] (https://www.npmjs.com/package/npm) che l'ultimo è 2.6.0. – Hydrothermal

+0

Sembra che tu sia riuscito a installare 'npm @ next', che è la versione pre-release di' npm'. I file '.cmd' creati da' npm' sono creati dal pacchetto 'cmd-shim'. Se vuoi vedere come funziona, puoi dare un'occhiata a https://github.com/ForbesLindesay/cmd-shim Sembra che tu abbia una richiesta di funzionalità per 'npm' o' cmd-shim' progetto; Non credo sia attualmente possibile fare 'npm' fare quello che vuoi qui. –

+0

Grazie per le informazioni! Ricordo di aver installato 'npm @ next' per risolvere un altro problema che stavo avendo, quindi credo che tu abbia ragione su questo. – Hydrothermal

5

La soluzione è quella di aggiungere #!/usr/bin/env node all'inizio del vostro script bin. Non ho idea del perché però. Ho scoperto confrontando il mio script con altri che hanno funzionato.

Problemi correlati