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 la develop
tâche, je veux exécuter clean
et après avoir terminé, exécuter coffee
et quand cela est fait, exécuter autre chose. Mais je ne peux pas comprendre cela. Cette pièce ne fonctionne pas. S'il vous plaît donnez votre avis.
javascript
node.js
coffeescript
gulp
iLemming
la source
la source
run-sequence
obsolète - voir la réponse de massanishi ciRéponses:
Ce n'est pas encore une version officielle, mais la prochaine version de Gulp 4.0 vous permet de faire facilement des tâches synchrones avec gulp.series. Vous pouvez simplement le faire comme ceci:
J'ai trouvé un bon article de blog présentant la mise à niveau et l'utilisation de ces fonctionnalités intéressantes: migration vers gulp 4 par exemple
la source
gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
Par défaut, gulp exécute les tâches simultanément, sauf si elles ont des dépendances explicites. Ce n'est pas très utile pour des tâches comme
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
run-sequence
plugin spécifiquement pour résoudre ce problème avec gulp. Après l'avoir installé, utilisez-le comme ceci:Vous pouvez lire les instructions complètes sur le paquet README - il prend également en charge l'exécution simultanée de certains ensembles de tâches.
Veuillez noter que cela sera (effectivement) corrigé dans la prochaine version majeure de gulp , car ils éliminent complètement l'ordre de dépendance automatique et fournissent des outils similaires à
run-sequence
pour vous permettre de spécifier manuellement l'ordre d'exécution comme vous le souhaitez.Cependant, c'est un changement majeur, il n'y a donc aucune raison d'attendre quand vous pouvez l'utiliser
run-sequence
aujourd'hui.la source
gulp-clean
plugin n'implémentait pas Streams 2, il a donc eu des problèmes en tant que dépendances. Cela a été corrigé à partir de la version 0.3.0, mon collègue a soumis un PR pour le convertir.run-sequence
résout un élément critique des fonctionnalités manquantes dans gulp.La seule bonne solution à ce problème peut être trouvée dans la documentation de gulp qui peut être trouvée ici
la source
ReferenceError: err is not defined
j'essaie d'exécuter cela sur unegulp-compass
tâche, est-ce que je manque quelque chose?return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');
, la clé est d'identifier la tâche un comme dépendante lors de la définition de la tâche deux: lagulp.task('two', ['one'], function() {...
tâche deux attendra maintenant la fin de la tâche un avant de s'exécuter.J'ai généré une application node / gulp en utilisant le générateur Yeoman generator -gulp-webapp . Il a géré le "casse-tête propre" de cette façon (se traduisant par les tâches d'origine mentionnées dans la question):
la source
gulp.start()
, cette réponse d'un membre de gulp 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 ne le détecte pas, ladevelop
tâche se terminera plus tôt quecoffee
run-sequence
code source:gulp.on('task_stop')
. Voir ma réponse étendue pour plus de détails: stackoverflow.com/a/38818657/3027390run-sequence est le moyen le plus clair (au moins jusqu'à la sortie de Gulp 4.0)
Avec run-sequence , votre tâche ressemblera à ceci:
Mais si vous (pour une raison quelconque) préférez ne pas l'utiliser, la
gulp.start
méthode vous aidera :Remarque: Si vous démarrez uniquement la tâche sans écouter le résultat, la
develop
tâche se terminera plus tôt quecoffee
, et cela peut prêter à confusion.Vous pouvez également supprimer l'écouteur d'événements lorsqu'il n'est pas nécessaire
Considérez qu'il y a aussi un
task_err
événement que vous voudrez peut-être écouter.task_stop
est déclenché en cas de réussite, tandis quetask_err
s'affiche en cas d'erreur.Vous pouvez également vous demander pourquoi il n'y a pas de documentation officielle pour
gulp.start()
. Cette réponse d'un membre de gulp explique les choses:(source: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )
la source
Selon les documents Gulp:
Pour exécuter votre séquence de tâches de manière synchrone:
gulp.src
)gulp.task
pour informer la tâche de la fin du flux.gulp.task
.Voir le code révisé:
la source
J'avais exactement le même problème et la solution s'est avérée assez facile pour moi. Modifiez simplement votre code comme suit et cela devrait fonctionner. REMARQUE: le retour avant gulp.src a fait toute la différence pour moi.
la source
essayé toutes les solutions proposées, tous semblent avoir leurs propres problèmes.
Si vous regardez réellement la source d'Orchestrator, en particulier l'
.start()
implémentation, vous verrez que si le dernier paramètre est une fonction, il la traitera comme un rappel.J'ai écrit cet extrait pour mes propres tâches:
la source
Je cherchais cette réponse depuis un moment. Maintenant, je l'ai dans la documentation officielle de Gulp.
Si vous souhaitez effectuer une tâche gulp lorsque la dernière est terminée, vous devez renvoyer un flux:
la source
Faites simplement
coffee
dépendreclean
etdevelop
dépendez decoffee
:L'envoi est désormais en série:
clean
→coffee
→develop
. Notez queclean
la mise en œuvre etcoffee
l'implémentation doivent accepter un rappel, "afin que le moteur sache quand cela sera fait" :En conclusion, voici un modèle de gulp simple pour une
clean
dépendance de construction synchrone suivie par des dépendances de construction asynchrones :Gulp est assez intelligent pour fonctionner
clean
exactement une fois parbuild
, quel que soit le nombre debuild
dépendances dont dépendclean
. Comme écrit ci-dessus,clean
est une barrière de synchronisation, alors toutesbuild
les dépendances de s'exécutent en parallèle, puisbuild
s'exécute.la source
Pour moi, il n'exécutait pas la tâche minify après la concaténation car il attend une entrée concaténé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 cela n'a pas fonctionné. Cela a fonctionné après avoir ajouté juste un
return
pour chaque tâche et obtenu la minification à l'intérieurgulp.start()
comme ci-dessous.Source http://schickling.me/synchronous-tasks-gulp/
la source
Gulp et Node utilisent des promesses .
Vous pouvez donc faire ceci:
Si vous renvoyez le flux gulp, vous pouvez utiliser la
then()
méthode pour ajouter un rappel. Alternativement, vous pouvez utiliser le Node natifPromise
pour créer vos propres promesses. Ici, j'ai l'habitudePromise.all()
d'avoir un rappel qui se déclenche lorsque toutes les promesses sont résolues.la source
Essayez ce hack :-) Gulp v3.x Hack for Async bug
J'ai essayé toutes les méthodes "officielles" du fichier Lisezmoi, elles ne fonctionnaient pas pour moi, mais cela a fonctionné. Vous pouvez également passer à gulp 4.x mais je vous le déconseille fortement, cela casse tellement de choses. Vous pourriez utiliser une vraie promesse js, mais bon, c'est rapide, sale, simple :-) Essentiellement, vous utilisez:
Consultez le post!
la source