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.