Esecuzione di script NPM in sequenza


150

Diciamo che ho

"scripts": {
    "pre-build": "echo \"Welcome\" && exit 1",
    "build_logic": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
    "post_build":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
    "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
  },

Quale comando NPM posso eseguire per consentire a tutti questi script di avviarsi in sequenza. Quando utilizzo il pre / post fixing, si avviano in sequenza ma non attendono il completamento dello script parent prima dell'esecuzione. Suppongo che l'unica soluzione sia la seguente: come faccio a far sparire sequenzialmente le attività di Gulp quando si eseguono comandi shell in una funzione di supporto async.series? ? So che questo può essere fatto con Gulp, ma per ora vorrei attenermi a NPM per esplorare le sue capacità. Grazie per qualsiasi aiuto!


Risposta aggiornata in fondo
— Tzach Ovadia,

Secondo la documentazione del Startcomando, dovresti essere in grado di utilizzare il /waitparametro (Avvia applicazione e attendi che termini)
— Tzach Ovadia

Risposte:


317

Richiamare questi script tramite npm run e raggrupparli con doppia e commerciale &&:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

Spiegazione:

  • Utilizzare &&(doppia e commerciale) per l'esecuzione sequenziale.
  • Utilizzare &(singola e commerciale) per l'esecuzione parallela.

4
Funziona al meglio perché viene eseguito in ordine, poiché ogni comando non viene eseguito fino a quando non è terminato il precedente, come richiesto nel PO. Grazie
— Rice,

20
&&vengono valutati dalla shell e non funzionano su Windows.
— Bernhard Döbler,

12
Questa non dovrebbe essere la risposta accettata. Per @ BernhardDöbler, la &&sintassi è un costrutto UNIX. Si comporterà in modo errato sui computer Windows, con conseguenze potenzialmente dannose per il processo di compilazione.
— Rafe Goldberg,

3
@RafeGoldberg L'operatore && ha lo stesso comportamento di esecuzione in entrambi gli ambienti Windows e * nix, ovvero l'esecuzione sequenziale ... A meno che non ci manchi qualcosa?
— Rice,

3
@Rice oy vey; era stupido e mescolava i miei operatori a singola e doppia e commerciale. Secondo i npm-run-alldocumenti: "a volte usiamo &per eseguire più comandi in parallelo, ma Windows ' cmd.exe... non supporta [questo operatore]". Quindi sembrerebbe che tu avessi ragione - almeno dalla mia breve ricerca l' &&operatore sembra perfettamente compatibile con più piattaforme.
— Rafe Goldberg,

31

Seguendo l'ottima risposta di @ Mobiletainment , puoi anche usare npm-run-all per rendere il comando molto più breve e molto più leggibile. Nel tuo caso:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}

run-sè un collegamento npm-run-allfornito, che esegue tutti gli script npm forniti in sequenza, quindi il -s( run-sè una versione più breve di npm-run-all -s).


19

Potresti semplicemente inserirli in un altro script. "start": "pre-build && build_logic && post_build && exit"


2
Richiederei loro di aspettarsi l'un l'altro per finire, questi si accenderanno in sequenza ma non aspetteranno.
— Rice,

2
Non penso che questo sia un problema nodo / npm. Il startcomando che si sta eseguendo in Windows tecnicamente è terminato. Utilizzare il /waitflag con startper forzare l' startapplicazione a rimanere aperta fino al completamento del metodo interno.
— dvlsg,

Per verificarlo, eseguilo start notepadda un prompt dei comandi, quindi dai un'occhiata al prompt dei comandi originale. Dovresti essere in grado di digitare un altro comando. Quindi corri start /wait notepad. Il startcomando dovrebbe continuare a "eseguirsi" mentre la finestra del blocco note è aperta (dare nuovamente un'occhiata al prompt dei comandi). Quindi, una volta chiuso il blocco note, startsarà finito.
— dvlsg,

La soluzione \ wait non funziona per i comandi aggiunti tramite doppia e commerciale o comandi npm pre / post fissi.
— Rice,

15

Puoi aggiungere il prefisso ai tuoi script pree postcosì verranno eseguiti automaticamente:

"scripts": {
  "prebuild": "echo \"Welcome\" && exit 1",
  "build": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
  "postbuild":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
  "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
}

quindi corri npm run build


questo non funziona, come indicato nella domanda: "Quando uso la correzione pre / post, si avviano in sequenza ma non attendono il completamento dello script padre prima dell'esecuzione."
— Russell Chisholm,

3

Puoi provare:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},

2

Puoi usare npm-run-all per combinare più comandi in molti modi diversi

Ad esempio, se avevi i seguenti script nel tuo package.json:

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}

Potresti eseguirli tutti in sequenza in questo modo:

$ npm-run-all clean lint build

Vedi questa domanda per come eseguire più comandi npm in parallelo


1
Questa è la strada da percorrere. npm-run-all è il migliore. E produrrà un package.json multipiattaforma.
— Robert,
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.