Iniciar un proceso de shell en Gulp con callback cuando se inicia el proceso

Estoy tratando de ejecutar algunas tareas en Gulp, secuencialmente. Una de esas tareas es un script de shell que realiza una simple $ node app.js ¿Cómo puedo activar la callback para decirle a Gulp que el servidor se ha iniciado?

tl; dr


Así que aquí está la imagen más grande de lo que estoy tratando de lograr:

Estoy usando gulp run-sequence para iniciar una serie de tareas de forma secuencial, que especifica un par de formas en las que deberías escribir tus tareas para que se ejecuten en secuencia.

Cada gulp.task() debe:

  • return el stream o
  • llamar a una callback en la tarea

Mi configuración:

  • gulp.task("clean", ..); // returns the stream, all OK
  • gulp.task("compile", ..); // returns the stream, all OK
  • gulp.task("spin-server", ..); // calls the callback with a hack
  • gulp.task("init-browser-sync", ..); // last task

Aquí está mi tarea de spin-server :

 gulp.task("spin-server", function(cb) { exec("sh shell-utilities/spin-server"); // @HACK allow time for the server to start before `runSequence` // runs the next task. setTimeout(function() { cb(); }, 2500); }); 

Y aquí está el spin-server.sh shell spin-server.sh :

 ## Start Node server ## node server/app.js ####### # EOF # ####### 

El problema

En este momento estoy usando un hack setTimeout para asegurarme de que mi servidor Node / Express se haya encendido antes de proceder a ejecutar la tarea init-browser-sync .

¿Cómo puedo eliminar ese setTimeout y llamar a cb() cuando mi servidor Express realmente se inicia?

Si desea generar un proceso pero escuchar su salida, puede iniciarlo con exec y luego adjuntar escuchas a la salida estándar del proceso.

 var exec = require('child_process').exec; gulp.task("spin-server", function() { var child = exec("sh shell-utilities/spin-server"); child.stdout.on('data', function(data) { console.log('stdout: ' + data); }); child.stderr.on('data', function(data) { console.log('stderr: ' + data); }); child.on('close', function(code) { console.log('closing code: ' + code); }); }); 

Use spawn lugar de exec ( require('child_process').spawn ) así:

 var srv = spawn("sh shell-utilities/spin-server"); gulp.task("spin-server", function(cb) { var srv = spawn("sh shell-utilities/spin-server"); srv.stdout.on('data', data => { if(data.includes('server listening')) { // Or whatever your server outputs when it's done initializing console.log('Server initialization completed'); return cb(); } }); }); 

Cuando la server listening cadenas se encuentra en la salida del proceso generado, se llama a cb() y se garantiza que el servidor se inicializará en ese punto.

 gulp.task("spin-server", function(cb) { const spawn = require('child_process').spawn; const process = spawn('bash', ['', 'setup.sh']); process.stdout.on('data', (data) => { if(data = "SCRIPT CHECKPOINT") cb(); }); }); 

Utilice spawn para no asíncrono exec.

Deje que su archivo setup.sh imprima "SCRIPT CHECKPOINT" o algo similar para informar que el servidor está en funcionamiento “.

Esto activará el cb() .