Étant donné que votre tâche peut contenir du code asynchrone, vous devez signaler gulp lorsque votre tâche a terminé son exécution (= "achèvement asynchrone").
Dans Gulp 3.x, vous pourriez vous en sortir sans faire cela. Si vous n'avez pas explicitement signalé la fin de l'async, Gulp supposerait simplement que votre tâche est synchrone et qu'elle est terminée dès que votre fonction de tâche revient. Gulp 4.x est plus strict à cet égard. Vous devez signaler explicitement la fin de la tâche.
Vous pouvez le faire de six manières :
1. Renvoyer un flux
Ce n'est pas vraiment une option si vous essayez d'imprimer quelque chose, mais c'est probablement le mécanisme d'achèvement asynchrone le plus fréquemment utilisé puisque vous travaillez généralement avec des flux gulp. Voici un exemple (plutôt artificiel) le démontrant pour votre cas d'utilisation:
var print = require('gulp-print');
gulp.task('message', function() {
return gulp.src('package.json')
.pipe(print(function() { return 'HTTP Server Started'; }));
});
La partie importante ici est la return
déclaration. Si vous ne renvoyez pas le flux, gulp ne peut pas déterminer quand le flux est terminé.
2. Retournez un Promise
Il s'agit d'un mécanisme beaucoup plus adapté à votre cas d'utilisation. Notez que la plupart du temps, vous n'aurez pas à créer l' Promise
objet vous-même, il sera généralement fourni par un package (par exemple, le del
package fréquemment utilisé renvoie a Promise
).
gulp.task('message', function() {
return new Promise(function(resolve, reject) {
console.log("HTTP Server Started");
resolve();
});
});
L'utilisation de la syntaxe async / attente peut être encore simplifiée. Toutes les fonctions marquées async
renvoient implicitement une promesse, de sorte que ce qui suit fonctionne également (si votre version node.js le prend en charge ):
gulp.task('message', async function() {
console.log("HTTP Server Started");
});
3. Appelez la fonction de rappel
C'est probablement le moyen le plus simple pour votre cas d'utilisation: gulp passe automatiquement une fonction de rappel à votre tâche comme premier argument. Appelez simplement cette fonction lorsque vous avez terminé:
gulp.task('message', function(done) {
console.log("HTTP Server Started");
done();
});
Ceci est surtout utile si vous devez appeler un outil de ligne de commande directement car il n'y a pas de wrapper node.js disponible. Cela fonctionne pour votre cas d'utilisation, mais je ne le recommanderais évidemment pas (d'autant plus qu'il n'est pas très portable):
var spawn = require('child_process').spawn;
gulp.task('message', function() {
return spawn('echo', ['HTTP', 'Server', 'Started'], { stdio: 'inherit' });
});
Je n'ai jamais utilisé ce mécanisme, mais si vous utilisez RxJS, cela pourrait être utile. C'est un peu exagéré si vous voulez juste imprimer quelque chose:
var of = require('rxjs').of;
gulp.task('message', function() {
var o = of('HTTP Server Started');
o.subscribe(function(msg) { console.log(msg); });
return o;
});
Comme le précédent, j'inclus ceci par souci d'exhaustivité, mais ce n'est pas vraiment quelque chose que vous allez utiliser, sauf si vous utilisez déjà un EventEmitter
pour une raison quelconque.
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
. Utilisez ceci: github.com/shama/webpack-stream/issues/…