NPM ejecuta una tarea paralela, pero espere hasta que el recurso esté disponible para ejecutar la segunda tarea

En npm, ¿cómo puedo ejecutar dos o más tareas paralelas, pero esperando que el recurso que creará la primera tarea esté disponible para que la segunda tarea lo utilice, y así sucesivamente?

ejemplo (conceptual):

npm run task1 & waitfor task1 then task2 & waitFor task3 then task4 ... 

¿algunas ideas?

EDITAR

Como ejemplo: Digamos que mi primera tarea es iniciar un servidor web, y mi segunda tarea es consumir datos de ese servidor web cada vez que ocurre un evento. Otro ejemplo: mi primera tarea podría ser iniciar webdriver-manager, mi segunda tarea, iniciar un servidor web, y mi tercera tarea, ejecutar pruebas e2e cada vez que se cambian mis archivos. Por lo tanto, necesito que todas esas tareas sigan ejecutándose simultáneamente, pero deben inicializarse en un orden y tiempo específicos.

Puede probar simultáneamente con el paquete de espera para administrar scripts y resultados conccurentes / secuenciales. Los lanzamientos secuenciales de espera soportan el estado de respuesta de la cabeza, la escucha de TCP, …

Por ejemplo :

 "scripts": { "start": "concurrently -k -n \"DB,API,WEB\" -c \"blue,magenta,yellow\" \"npm run start-db\" \"npm run start-api\" \"npm run start-web\"", "start-db": "myDbServerCmd", "start-api": "wait-on tcp:27017 && myApiServerCmd", "start-web": "myFrontServerCmd", } 

Gracias dchambers por la idea ( fuente ).

No estoy seguro de entender completamente su requerimiento, así que le proporcionaré algunas soluciones posibles.

Es posible que desee ejecutar las tareas de forma secuencial (la primera solución a continuación), sin embargo, en su publicación mencione en paralelo.


1. Ejecutando tareas secuencialmente

npm-scripts compatible con el operador && , que se utiliza normalmente en los bash shells. Sin embargo, el operador && , utilizado en npm-scripts , funciona de manera exitosa multiplataforma.

Ejemplo pseudo utilizando el operador && para encadenar tareas:

 "scripts": { "foo": "npm run task1 && npm run task2 && npm run task3" }, 

Ejecutando $ npm run foo través de su CLI usando el ejemplo anterior …

  1. Inicialmente ejecuta task1 .
  2. Cuando task1 haya completado con éxito (es decir, task1 sale con un estado de cero) , se ejecutará task2 .
  3. Cuando task2 haya completado con éxito, se ejecutará task3 .

Si el lado izquierdo del operador && falla por cualquier motivo (es decir, sale con un código / estado que no es cero) , las tareas subsiguientes en el lado derecho no se ejecutarán. Por ejemplo; si task1 falla, task2 y task3 no se ejecutarán.


2. Ejecutar tareas simultáneamente

npm-scripts también admite la plataforma multiplataforma de operador único para ejecutar tareas simultáneamente.

Ejemplo pseudo utilizando el operador & :

 "scripts": { "foo": "npm run task1 & npm run task2 & npm run task3" }, 

En este ejemplo, la principal diferencia entre el doble && y el operador simple & es que si el lado izquierdo del sencillo & falla, el lado derecho se ejecuta independientemente. Por ejemplo; si task1 falla, task2 todavía se ejecuta.


3. Ejecutando tareas en paralelo.

Para ejecutar tareas en paralelo, te recomiendo que utilices paralelos :

$ npm i -D parallelshell

Pseudo ejemplo usando parallelshell :

 "scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" \"npm run task3\"" }, 

Este ejemplo inicialmente parece muy similar al uso del operador sencillo que se muestra en la sección anterior, sin embargo, ofrece beneficios adicionales como se indica en la documentación . El principal beneficio (IMO) es:

Si comando1 o comando2 salen con un código de salida distinto de cero, esto no afectará el resultado de su shell (es decir, pueden fallar y npm / bash / lo que sea que lo ignore). parallelshell no lo ignorará, y saldrá con el primer código de salida distinto de cero.


4. Ejecutando tareas en paralelo y secuencialmente.

Digamos que desea ejecutar task1 y task2 en paralelo / simultáneamente y luego ejecutar task3 solo cuando task1 y task2 hayan completado con éxito.

Para lograr esto, puede utilizar tanto alelo parallelshell como el operador integrado de && .

Ejemplo pseudo utilizando parallelshell y el operador && para encadenar tareas:

 "scripts": { "foo": "parallelshell \"npm run task1\" \"npm run task2\" && npm run task3" }, 

EDITAR

Una solución basada en la siguiente actualización / edición de OP:

Otro ejemplo: mi primera tarea podría ser iniciar webdriver-manager, mi segunda tarea, iniciar un servidor web, y mi tercera tarea, ejecutar pruebas e2e cada vez que se cambian mis archivos. Por lo tanto, necesito que todas esas tareas sigan ejecutándose simultáneamente, pero deben inicializarse en un orden y tiempo específicos.

5. Ejecutar tareas al mismo tiempo.

al mismo tiempo se puede utilizar para ejecutar tareas simultáneamente:

$ npm i -D concurrently

Ejemplo pseudo utilizando concurrently :

 "scripts": { "foo": "concurrently \"npm run task1\" \"npm run task2\" \"npm run task3\"" }, 

Este ejemplo mantendrá todas las tareas (1,2 y 3) ejecutándose simultáneamente, y comenzarán en el orden especificado. No conozco los detalles suficientes de las herramientas mencionadas en su caso de uso de ejemplo, sin embargo, todos los ejemplos proporcionados en esta publicación se pueden combinar según sea necesario para cumplir con sus requisitos exactos.

concurrently también tiene varias opciones útiles también.