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!


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.

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).


19

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


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


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

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


1
Este es el camino a seguir. npm-run-all es lo mejor. Y producirá un package.json que es multiplataforma.
Robert
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.