Dado que su tarea puede contener código asincrónico, debe indicar un trago cuando su tarea haya terminado de ejecutarse (= "finalización asíncrona").
En Gulp 3.x puedes escapar sin hacer esto. Si no indicó explícitamente la finalización asincrónica, solo supondría que su tarea es sincrónica y que finaliza tan pronto como regrese la función de la tarea. Gulp 4.x es más estricto a este respecto. Tienes que indicar explícitamente la realización de tareas.
Puedes hacerlo de seis maneras :
Esta no es realmente una opción si solo está tratando de imprimir algo, pero es probablemente el mecanismo de finalización asíncrona más utilizado ya que generalmente está trabajando con flujos de tragos. Aquí hay un ejemplo (bastante artificial) que lo demuestra para su caso de uso:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
La parte importante aquí es la return
declaración. Si no devuelve la transmisión, trago no puede determinar cuándo la transmisión ha finalizado.
Este es un mecanismo mucho más apropiado para su caso de uso. Tenga en cuenta que la mayoría de las veces no tendrá que crear el Promise
objeto usted mismo, generalmente lo proporcionará un paquete (por ejemplo, el del
paquete utilizado con frecuencia devuelve a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
El uso de la sintaxis async / await puede simplificarse aún más. Todas las funciones marcadas async
devuelven implícitamente una Promesa, por lo que lo siguiente también funciona (si su versión node.js lo admite ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Llame a la función de devolución de llamada
Esta es probablemente la forma más fácil para su caso de uso: gulp pasa automáticamente una función de devolución de llamada a su tarea como primer argumento. Simplemente llame a esa función cuando haya terminado:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Esto es principalmente útil si tiene que invocar una herramienta de línea de comandos directamente porque no hay un contenedor node.js disponible. Funciona para su caso de uso, pero obviamente no lo recomendaría (especialmente porque no es muy portátil):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Nunca he usado este mecanismo, pero si estás usando RxJS podría ser útil. Es una exageración si solo quieres imprimir algo:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Al igual que el anterior, lo incluyo por razones de integridad, pero en realidad no es algo que vaya a usar a menos que ya lo esté usando EventEmitter
por alguna razón.
gulp.task('message3', function() {
var e = new EventEmitter();
e.on('msg', function(msg) { console.log(msg); });
setTimeout(() => { e.emit('msg', 'HTTP Server Started'); e.emit('finish'); });
return e;
});
webpack-stream
. Use esto: github.com/shama/webpack-stream/issues/…