2015-06-22 12 views
8

Ho un pacchetto che ha uno script nel suo package.json che vorrei essere in grado di eseguire nel mio progetto di livello superiore. Questo pacchetto è una delle mie dipendenze dei progetti di alto livello. Sto cercando un modo per chiamare direttamente o indirettamente lo script dei pacchetti di dipendenza.Come eseguire uno script npm di un pacchetto dipendente

Supponiamo che il nome del modulo con cui sto lavorando sia denominato foo e che lo script che voglio eseguire sia updateFooData.

Ho provato a utilizzare la sintassi npm run-script <package> <...> per eseguirlo, ma questa sembra essere una funzionalità deprecata in quanto non riesco a trovarla nell'attuale official documentation ma la vedo in altri (molto vecchi) risultati di ricerca.

npm run-script foo updateFooData 

# npm ERR! missing script: foo 

ho anche guardato nella api NPM e mentre npm.commands.run-script(args, callback) farà quello che voglio, non riesco a capire come caricare il modulo in NPM

{ 
    ... 
    "scripts":{ 
    "foo:updateFooData": "node --eval \"... ??; npm.commands.run-script('updateFooData', callback)\"" 
    } 
} 

npm run foo:updateFooData 
# Obviously fails 

L'unica cosa che ho trovato che funziona finora è il CD nella directory del sottomodulo ed eseguire npm da lì. Questa non è la soluzione preferita per me.

cd node_modules/foo 
npm run updateFooData 

risposta

0

Qualcosa ho trovato che funziona:

Se lo script si esegue esegue un file di script, è possibile guardare il percorso del file è in esecuzione ed eseguire lo script utilizzando un bisogno:

# if node_modules/foo/package.json looks like this 
{ 
    "scripts": { 
    "updateFooData":"scripts/updateFooData.js" 
    } 
} 

# then package.json can look like this 
{ 
    "scripts": { 
    "foo:updateFooData":"node --eval \"require('foo/scripts/updateFooData.js')\"" 
    } 
} 

# or package.json can look like this 
{ 
    "scripts": { 
    "foo:updateFooData":"node node_modules/foo/scripts/updateFooData.js" 
    } 
} 

# and you can run it like this 
npm run foo:updateFooData 

non mi piace questa soluzione perché funziona solo se lo script NPM è in esecuzione è un file. Non si applica a tutti

11

Mi sono imbattuto in questo tentativo di eseguire lo script updatedb per geoip-lite. Dovresti usare lo npm explore command che genererà una nuova shell nella directory delle dipendenze.

Quindi per la vostra caso d'uso, provare npm explore foo -- npm run updateFooData

+1

copia-incolla: 'NPM esplorare geoip-lite - NPM eseguire updatedb' – aluxian

+2

Come una nota di cautela, questo non funziona per le finestre https://github.com/npm/npm/issues/8932 – Darly

+1

incredibile, è venuto qui cercando di automatizzare l'aggiornamento geoip-lite e imparato a conoscere il comando di esplorare. – dmo

Problemi correlati