javascript - Ejecutando scripts de NPM secuencialmente
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 de NPM puedo ejecutar para que todos estos scripts se lancen secuencialmente? Cuando uso prefijos o sufijos pre/post se lanzan secuencialmente, pero no esperan a que el script principal termine antes de ejecutarse. Supongo que la única solución es algo así: ¿Cómo hago para que las tareas de Gulp se ejecuten secuencialmente al ejecutar comandos de shell en una función helper async.series? Sé que esto se puede hacer con Gulp, pero me gustaría seguir usando NPM por ahora para explorar sus capacidades. ¡Gracias por cualquier ayuda!
Respuesta #1
Invoca estos scripts mediante npm run y encadénalos con doble ampersand &&:
npm run pre-build && npm run build_logic && npm run post_build && npm run exit
Puedes ejecutar el comando anterior directamente en la línea de comandos, o puedes configurarlo como otro script así:
"scripts": {
...
"build": "npm run pre-build && npm run build_logic && npm run post_build && npm run exit",
}
Y luego ejecuta toda la lista mediante npm run build.
Explicación:
- Usa
&&(doble ampersand) para la ejecución secuencial.
(Algunas versiones tempranas de Windows Powershell no soportaban esta sintaxis, pero las versiones recientes deberían.) - Usa
&(ampersand único) para la ejecución en paralelo. Prueba cuidadosamente, ya que los comandos anteriores en la lista pueden ejecutarse en segundo plano y podrías perder potencialmente la salida, incluyendo cualquier mensaje de error (dependiendo de tu plataforma/shell).
Respuesta #2
Siguiendo la excelente respuesta de @Mobiletainment, también puedes usar npm-run-all para hacer que el comando sea mucho más corto y mucho más legible. En tu caso:
"scripts": {
...
"build": "run-s pre-build build_logic post_build exit"
}
run-s es un atajo que proporciona npm-run-all, que ejecuta todos los scripts npm dados de manera secuencial, de ahí el -s (run-s es una versión más corta de npm-run-all -s).
Respuesta #3
Puede anteponer a sus scripts pre y post para que se ejecuten automáticamente:
"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\""
}
luego ejecuta npm run build
Respuesta #4
Podrías simplemente encadenarlos en otro script. "start": "pre-build && build_logic && post_build && exit"
