Como sua tarefa pode conter código assíncrono, é necessário sinalizar gulp quando a tarefa terminar de executar (= "conclusão assíncrona").
No Gulp 3.x, você pode fugir sem fazer isso. Se você não sinalizou explicitamente o gulp de conclusão assíncrona, apenas assumiria que sua tarefa é síncrona e que é concluída assim que sua função de tarefa retornar. Gulp 4.x é mais rigoroso nesse sentido. Você precisa sinalizar explicitamente a conclusão da tarefa.
Você pode fazer isso de seis maneiras :
1. Retornar um fluxo
Essa não é realmente uma opção se você está apenas tentando imprimir algo, mas é provavelmente o mecanismo de conclusão assíncrona mais frequentemente usado, já que você geralmente trabalha com fluxos gulp. Aqui está um exemplo (bastante artificial) que demonstra isso para o seu caso de uso:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
A parte importante aqui é a return
declaração. Se você não retornar o fluxo, o gulp não poderá determinar quando o fluxo terminou.
Esse é um mecanismo muito mais adequado para o seu caso de uso. Observe que na maioria das vezes você não precisará criar o Promise
objeto, ele geralmente será fornecido por um pacote (por exemplo, o del
pacote usado com freqüência retorna a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
Usando a sintaxe assíncrona / aguardada, isso pode ser simplificado ainda mais. Todas as funções marcadas async
implicitamente retornam uma promessa, para que o seguinte também funcione (se a versão do node.js. suportar ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Chame a função de retorno de chamada
Esta é provavelmente a maneira mais fácil para o seu caso de uso: o gulp passa automaticamente uma função de retorno de chamada para sua tarefa como seu primeiro argumento. Basta chamar essa função quando terminar:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Isso é útil principalmente se você precisar chamar uma ferramenta de linha de comando diretamente, porque não há nenhum wrapper node.j disponível. Funciona para o seu caso de uso, mas obviamente eu não o recomendaria (especialmente porque não é muito portátil):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Eu nunca usei esse mecanismo, mas se você estiver usando o RxJS, pode ser útil. É meio exagero se você quiser 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;
});
Como o anterior, estou incluindo isso por uma questão de integridade, mas não é algo que você usará, a menos que já esteja usando um EventEmitter
por algum motivo.
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 isto: github.com/shama/webpack-stream/issues/…