Поскольку ваша задача может содержать асинхронный код, вы должны сигнализировать gulp, когда ваша задача завершит выполнение (= "асинхронное завершение").
В Gulp 3.x вы могли бы уйти, не делая этого. Если вы не указали явное асинхронное завершение, gulp просто предположил бы, что ваша задача является синхронной и что она завершается, как только ваша задача возвращается. Gulp 4.x более строг в этом отношении. Вы должны явно сигнализировать о завершении задачи.
Вы можете сделать это шестью способами :
1. Верните поток
На самом деле это не вариант, если вы только пытаетесь что-то напечатать, но это, вероятно, наиболее часто используемый механизм асинхронного завершения, поскольку вы обычно работаете с потоками gulp. Вот (довольно надуманный) пример, демонстрирующий это для вашего варианта использования:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
Важной частью здесь является return
утверждение. Если вы не вернете поток, gulp не сможет определить, когда поток закончился.
Это гораздо более подходящий механизм для вашего случая использования. Обратите внимание, что в большинстве случаев вам не нужно создавать Promise
объект самостоятельно, обычно он предоставляется пакетом (например, часто используемый del
пакет возвращает a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
С помощью синтаксиса async / await это может быть еще более упрощено. Все функции, помеченные async
неявно, возвращают Promise, поэтому также работает следующее (если ваша версия node.js поддерживает это ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Вызвать функцию обратного вызова
Вероятно, это самый простой способ для вашего варианта использования: gulp автоматически передает функцию обратного вызова вашей задаче в качестве первого аргумента. Просто вызовите эту функцию, когда закончите:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Это в основном полезно, если вам нужно вызывать инструмент командной строки напрямую, потому что нет доступной обертки node.js. Это работает для вашего случая использования, но, очевидно, я бы не рекомендовал его (тем более что он не очень портативный):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Я никогда не использовал этот механизм, но если вы используете RxJS, он может быть полезен. Это немного излишне, если вы просто хотите что-то напечатать:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Как и предыдущий, я включаю это для полноты картины, но на самом деле это не то, что вы собираетесь использовать, если EventEmitter
по какой-то причине вы уже не используете его .
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
. Используйте это: github.com/shama/webpack-stream/issues/…