¿Cómo puedo hacer que las tareas de Gulp se activen secuencialmente cuando se ejecutan comandos de shell en una función auxiliar de async.series?

Tengo varias tareas de Gulp que envían una serie de comandos al shell. La segunda tarea depende de la primera. Cómo asegurarse de que todos los comandos enviados a async.series en la primera tarea estén completos antes de que se ejecute la segunda tarea

gulp.task('task1', function(cb) { process.chdir(__dirname); process.chdir('path'); var cmdArray = getCmdsForTask1(); runSeries(cmdArray, 'Task 1'); return cb(); }); gulp.task('task2',['task1'], function() { process.chdir(__dirname); process.chdir('task2_path'); var cmd2 = getCmdForTask2(); runSeries([cmd2], 'Task 2'); }); var runSeries = function(cmdArray, taskName) { async.series(cmdArray, function(err, results) { results.forEach( function(result) { gutil.log(gutil.colors.cyan(taskName + ' complete:') + gutil.colors.white(result) ); }); }); }; 

¡Muchas gracias!

Estás en el camino correcto usando async.series. La única pieza faltante es que no has dicho la tarea original cuando está hecha.

 gulp.task('task1', function(cb) { process.chdir(__dirname); process.chdir('path'); var cmdArray = getCmdsForTask1(); runSeries(cmdArray, 'Task 1', cb); }); gulp.task('task2',['task1'], function(cb) { process.chdir(__dirname); process.chdir('task2_path'); var cmd2 = getCmdForTask2(); runSeries([cmd2], 'Task 2', cb); }); var runSeries = function(cmdArray, taskName, cb) { async.series(cmdArray, function(err, results) { results.forEach( function(result) { gutil.log(gutil.colors.cyan(taskName + ' complete:') + gutil.colors.white(result) ); }); cb(err); }); }; 

Observe cómo recibí una callback para cada tarea y la llamé cuando se completó async.series.

En lugar de que las tareas dependan unas de otras utilizando la syntax [], puede usar un complemento de nodo llamado run-sequence .

 gulp.task('build', function(callback) { runSequence('build-clean', ['build-scripts', 'build-styles'], 'build-html', callback); }); 

Este ejemplo significa ejecutar ‘build-scripts’ y ‘build-styles’ en paralelo pero no ejecute ‘build-html’ hasta que ambos estén completos

Creo que lo que estás buscando es la función de cascada . Ejecutará la primera tarea, luego enviará los resultados a la segunda tarea y así sucesivamente. De la documentación:

cascada (tareas, [callback])

Ejecuta la matriz de tareas de funciones en serie, cada una pasa sus resultados a la siguiente en la matriz. Sin embargo, si cualquiera de las tareas pasa un error a su propia callback, la siguiente función no se ejecuta, y la callback principal se llama inmediatamente con el error.