Comment faire pour exécuter Gulp tâches de manière séquentielle, l'un après l'autre
dans l'extrait de code comme ceci:
gulp.task "coffee", ->
gulp.src("src/server/**/*.coffee")
.pipe(coffee {bare: true}).on("error",gutil.log)
.pipe(gulp.dest "bin")
gulp.task "clean",->
gulp.src("bin", {read:false})
.pipe clean
force:true
gulp.task 'develop',['clean','coffee'], ->
console.log "run something else"
Dans develop
tâche je veux courir clean
et après c'est terminé, exécutez coffee
et quand c'est fait, lancez quelque chose d'autre. Mais je ne peux pas comprendre cela. Cette pièce ne fonctionne pas. Veuillez informer.
- L'exécution de la séquence de mnp module résout ce problème maintenant - toutes les autres réponses sont maintenant hors de propos - voir Trop de réponse ci-dessous
- Gulp 4.0 prend en charge les tâches en cours d'exécution dans l'ordre, le rendu
run-sequence
obsolète - voir massanishi la réponse ci-dessous - Gulp4 des sauts de plus de choses qu'il corrige, il semblerait. Après avoir combattu avec elle pendant quelques heures, je suis de retour pour 3.9.1. Je me rends compte versions majeures peut/va briser backcompat mais avec plus compliqués et inutiles messages d'erreur, je dis non merci. v4 n'est pas prêt.
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas une version officielle, mais la à venir Gulp 4.0 vous permet de faire synchrone tâches avec gulp.de la série. Vous pouvez simplement le faire comme ceci:
J'ai trouvé un billet de blog bonne introduction comment mettre à niveau et faire de l'utilisation de ces fonctionnalités intéressantes:
la migration d'avaler de 4 par exemple
npm install gulp@next
comme l'a suggéré ici, au ces les problèmes sont résolus.gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
deps
paramètre exécuter en parallèle: github.com/gulpjs/gulp/blob/master/docs/API.md#depsrun-sequence
ougulp.series
.Par défaut, gulp exécute des tâches simultanément, à moins qu'ils ont des dépendances explicites. Ce n'est pas très utile pour des tâches comme la
clean
, où vous ne voulez pas dépendre, mais vous en avez besoin pour s'exécuter avant tout le reste.J'ai écrit le
exécuter-séquence
plugin spécifiquement pour résoudre ce problème avec gulp. Après l'installation, l'utiliser comme ceci:Vous pouvez lire les instructions sur l'emballage README — il prend également en charge l'exécution de certains ensembles de tâches simultanément.
Veuillez noter que ce sera (effectivement) corrigé dans la prochaine version majeure de gulp, car ils sont complètement éliminer la dépendance automatique de la commande, et de fournir des outils semblables à
run-sequence
pour vous permettre de spécifier manuellement l'ordre d'exécution la façon dont vous le souhaitez.Cependant, qui est une importante modification de rupture, donc il n'y a pas de raison d'attendre alors que vous pouvez utiliser
run-sequence
aujourd'hui.gulp-clean
plugin n'était pas la mise en œuvre de Flux de 2, il a eu des problèmes en cours d'exécution en tant que dépendances. Cela a été corrigé depuis la version de la version 0.3.0, mon co-travailleur soumis un PR de convertir plus.run-sequence
résout un élément essentiel des fonctionnalités manquantes dans gulp.gulp.task
après laconsole.log
, cela indique à avaler, lorsque les tâches sont terminées - dans le cas contraire, il se termine tôt.La seule bonne solution à ce problème peut être trouvée dans le gulp de la documentation qui peut être trouvé ici
default
tâcheone
sera exécuté deux fois. La première fois en parallèle avectwo
, et la seconde fois lors de l'exécution detwo
.ReferenceError: err is not defined
essayer de l'exécuter sur ungulp-compass
tâche, suis-je raté quelque chose?return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');
, l'essentiel est d'identifier une tâche comme une personne à charge lors de la définition de la tâche deux:gulp.task('two', ['one'], function() {...
Tâche deux maintenant attendre pour une tâche à la fin avant de la course.two
tâche de définition sinon, ils ne sont pas exécutées de manière séquentielle. J'aime le ridicule modèle de conception de discussion ici sur quelques gorgée de tâches, c'est juste des outils pour construire des scripts qui ne sont pas d'un milliard de dollar système de négociation!J'ai généré un nœud/gulp application à l'aide de la générateur-gulp-webapp générateur Yeoman. Il a traité les "propre énigme" de cette façon (la traduction à l'original des tâches mentionnées dans la question):
gulp.start()
, cette réponse de gulp membre explique que:gulp.start is undocumented on purpose because it can lead to complicated build files and we don't want people using it
(source: github.com/gulpjs/gulp/issues/426#issuecomment-41208007)coffee
tâche est terminée? Si je n'ai pas le détecter,develop
se terminera plus tôt quecoffee
run-sequence
code source:gulp.on('task_stop')
. Voir mon extension de répondre pour plus de détails: stackoverflow.com/a/38818657/3027390TypeError: gulp.start is not a function
de l'exécution de la séquence est le plus clair (du moins jusqu'à ce que Gulp 4.0 est sorti)
Avec de l'exécution de la séquence de, votre tâche va ressembler à ceci:
Mais si vous (pour certaines raisons) préfèrent ne pas l'utiliser,
gulp.start
méthode aidera:Remarque: Si vous ne démarrer la tâche, sans écouter le résultat,
develop
se terminera plus tôt quecoffee
, et qui peuvent être source de confusion.Vous pouvez également enlever l'écouteur d'événement lorsqu'il n'est pas nécessaire
Envisager il est également
task_err
événement vous pouvez écouter.task_stop
est déclenchée sur le succès de la finition, tout entask_err
apparaît quand il y a une erreur.Vous pouvez aussi vous demander pourquoi il n'y a pas de documentation officielle pour
gulp.start()
. Cette réponse de gulp membre explique les choses:(source: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007)
Selon le Gulp docs:
Pour exécuter votre séquence de tâches de façon synchrone:
gulp.src
) àgulp.task
d'informerla tâche lorsque le flux se termine.
gulp.task
.Voir le code révisé:
J'ai eu exactement le même problème et la solution s'est avéré être assez facile pour moi. Fondamentalement changer votre code à la suivante et cela devrait fonctionner. REMARQUE: le retour avant de l'avaler.la src a fait la différence pour moi.
essayé toutes les solutions proposées, tous semblent avoir des problèmes de leur propre.
Si vous regardez dans le Orchestrator source, en particulier la
.start()
mise en œuvre, vous verrez que si le dernier paramètre est une fonction qu'il va le traiter comme un rappel.J'ai écrit ce morceau de code pour mon propre tâches:
J'étais à la recherche de cette réponse pour un certain temps. Maintenant je l'ai eu dans l'officiel gorgée de la documentation.
Si vous souhaitez effectuer une gorgée tâche lorsque cette dernière est terminée, vous devez retourner un flux:
JS:
Simplement faire
coffee
dépendentclean
, etdevelop
dépendentcoffee
:De l'expédition est maintenant de série:
clean
→coffee
→develop
. Notez queclean
's la mise en œuvre etcoffee
's la mise en œuvre doit accepter un rappel, "de sorte que le moteur sait quand ça sera fait":En conclusion, voici un simple gorgée modèle pour un synchrones
clean
suivie par asynchrones dépendances de construction:Gulp est assez intelligent pour exécuter
clean
exactement une fois parbuild
, n'importe comment beaucoup debuild
's dépendances dépendentclean
. Comme écrit ci-dessus,clean
est une barrière de synchronisation, puis tousbuild
's dépendances exécuter en parallèle, puisbuild
s'exécute.Pour moi, il n'était pas l'exécution de la rapetisser tâche après concaténation comme il s'attend à ce concaténées d'entrée et il n'a pas été généré quelques fois.
J'ai essayé d'ajouter à une tâche par défaut dans l'ordre d'exécution et il n'a pas travaillé. Il a travaillé, après l'ajout d'un
return
pour chacune des tâches et l'obtention de la minification à l'intérieur degulp.start()
comme ci-dessous.Source http://schickling.me/synchronous-tasks-gulp/
Gulp et Nœud utiliser promesses.
De sorte que vous pouvez le faire:
Si vous retournez le gulp flux, vous pouvez utiliser le
then()
méthode pour ajouter un rappel. Alternativement, vous pouvez utiliser un Nœud natifPromise
pour créer vos propres promesses. J'utilise iciPromise.all()
d'avoir un rappel qui se déclenche lorsque toutes les promesses résoudre.Essayer ce hack 🙂
Gulp v3.x Hack pour Async bug
J'ai essayé tous les "officiels" des moyens dans le fichier lisez-moi, ils n'ont pas de travail pour moi, mais ce n'. Vous pouvez également mettre à niveau vers gulp 4.x mais je vous recommande fortement vous ne le faites pas, il se casse tellement de choses. Vous pouvez utiliser un vrai js promesse, mais bon, c'est rapide, sale, simple 🙂
Essentiellement, vous utilisez:
Découvrez le post!