Ejecutar secuencias de comandos NPM secuencialmente

150

Digamos que tengo

"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\""
  },

¿Qué comando NPM puedo ejecutar para permitir que todos estos scripts se ejecuten secuencialmente? Cuando uso la corrección previa / posterior, se inician secuencialmente pero no esperan a que el script principal termine antes de ejecutarse. Supongo que la única solución es: ¿Cómo hago que las tareas de Gulp se activen secuencialmente al disparar comandos de shell en una función auxiliar async.series? ? Sé que esto se puede hacer con Gulp, pero me gustaría seguir con NPM por ahora para explorar sus capacidades. ¡Gracias por cualquier ayuda!

Arroz
fuente
Respuesta actualizada en la parte inferior
Tzach Ovadia
De acuerdo con la documentación del Startcomando, debe poder usar el /waitparámetro (Iniciar la aplicación y esperar a que termine)
Tzach Ovadia

Respuestas:

316

Invoque estos scripts a través de npm run y encadénelos con doble ampersand &&:

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

Explicación:

  • Uso &&(doble ampersand) para ejecución secuencial.
  • Use &(ampersand simple) para ejecución paralela.
Mobiletainment
fuente
44
Esto funciona mejor porque se ejecuta en orden, ya que cada comando no se ejecuta hasta que finalice la versión anterior, como se solicitó en el OP. Gracias
Rice
20
&&son evaluados por el shell y no funcionan en Windows.
Bernhard Döbler el
12
Esta no debería ser la respuesta aceptada. Según @ BernhardDöbler, la &&sintaxis es una construcción UNIX. Se comportará incorrectamente en las máquinas de Windows, con consecuencias potencialmente graves para su proceso de compilación.
Rafe Goldberg
3
@RafeGoldberg El operador && tiene el mismo comportamiento de ejecución tanto en Windows como en entornos * nix, es decir, ejecución secuencial ... ¿A menos que haya algo que nos falte a todos?
Arroz
3
@Rice oy vey; estaba siendo tonto y mezclaba mis operadores simples y dobles. Según los npm-run-alldocumentos: "a veces usamos &para ejecutar comandos múltiples en paralelo, pero Windows ' cmd.exe... no es compatible con [este operador]". Así que parece que tenías razón: al menos, según mi breve investigación, el &&operador parece perfectamente compatible con todas las plataformas.
Rafe Goldberg
31

Siguiendo la excelente respuesta de @ Mobiletainment , también puede usar npm-run-all para hacer el comando mucho más corto y mucho más legible. En tu caso:

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

run-ses un acceso directo que npm-run-allproporciona, que ejecuta todos los npm-scripts dados secuencialmente, de ahí que -s( run-ses una versión más corta de npm-run-all -s).

O A.
fuente
19

Podrías encadenarlos en otro script. "start": "pre-build && build_logic && post_build && exit"

Dave V
fuente
2
Les pediría que esperen el uno al otro para terminar, estos se dispararán secuencialmente pero no esperarán.
Arroz
2
No creo que este sea un problema de nodo / npm. El startcomando que está ejecutando en Windows técnicamente está terminado. Use la /waitbandera con startpara forzar que la startaplicación permanezca abierta hasta que el método interno también haya finalizado.
dvlsg
Para probar esto, ejecute start notepaddesde el símbolo del sistema, luego eche un vistazo al símbolo del sistema original. Debería poder escribir otro comando. Entonces corre start /wait notepad. El startcomando debe continuar "ejecutándose" mientras la ventana de su bloc de notas está abierta (vuelva a mirar el símbolo del sistema). Luego, una vez que cierre el bloc de notas, startestará terminado.
dvlsg
La solución \ wait no funciona para los comandos agregados a través de doble ampersand o los comandos npm fijos pre / post.
Arroz
15

Puede prefijar las secuencias de comandos prey postpara que se ejecute de forma automática:

"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\""
}

entonces corre npm run build

Tzach Ovadia
fuente
esto no funciona, como se indica en la pregunta: "Cuando uso la corrección previa / posterior, se inician secuencialmente pero no esperan a que el script principal termine antes de ejecutarse".
Russell Chisholm
3

puedes probar:


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

Puede usar npm-run-all para combinar múltiples comandos de muchas maneras diferentes

Por ejemplo, si tenía los siguientes scripts en su package.json:

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

Podrías ejecutarlos todos secuencialmente de esta manera:

$ npm-run-all clean lint build

Vea esta pregunta sobre cómo ejecutar múltiples comandos npm en paralelo

KyleMit
fuente
1
Este es el camino a seguir. npm-run-all es lo mejor. Y producirá un package.json que es multiplataforma.
Robert