we fragmencie takim jak ten:
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"
W develop
zadaniu chcę uruchomić, clean
a po jego zakończeniu uruchomić, coffee
a kiedy to zrobisz, uruchom coś innego. Ale nie mogę tego rozgryźć. Ten kawałek nie działa. Proszę doradź.
javascript
node.js
coffeescript
gulp
iLemming
źródło
źródło
run-sequence
przestarzałymi - patrz odpowiedźOdpowiedzi:
To nie jest jeszcze oficjalna wersja, ale nadchodzący Gulp 4.0 pozwala łatwo wykonywać synchroniczne zadania z gulp.series. Możesz to po prostu zrobić w następujący sposób:
Znalazłem dobry post na blogu, w którym przedstawiłem, jak uaktualnić i wykorzystać te fajne funkcje: migracja do gulp 4 przez przykład
źródło
gulp.task('coffee', ['clean'], function(){...}); gulp.task('develop', ['coffee']);
Domyślnie gulp uruchamia zadania jednocześnie, chyba że mają wyraźne zależności. Nie jest to zbyt przydatne w przypadku zadań takich
clean
, w których nie chcesz polegać, ale musisz je uruchomić przed wszystkim innym.Napisałem ten
run-sequence
plugin specjalnie, aby rozwiązać ten problem z haustem. Po zainstalowaniu użyj go w następujący sposób:Możesz przeczytać pełne instrukcje na pakiecie README - obsługuje także uruchamianie niektórych zestawów zadań jednocześnie.
Uwaga: zostanie to (skutecznie) naprawione w następnej głównej wersji gulp , ponieważ całkowicie eliminują one automatyczne porządkowanie zależności i udostępniają narzędzia podobne
run-sequence
do pozwalające na ręczne określenie kolejności uruchamiania według potrzeb .Jest to jednak znacząca przełomowa zmiana, więc nie ma powodu, aby czekać, kiedy będzie można ją
run-sequence
dziś wykorzystać .źródło
gulp-clean
wtyczka nie implementowała strumieni 2, więc występowały problemy jako zależności. Zostało to naprawione od wersji 0.3.0, mój współpracownik przesłał PR, aby go przekonwertować.run-sequence
rozwiązuje krytyczny brakujący element w gulp.Jedyne dobre rozwiązanie tego problemu można znaleźć w dokumentacji łyka, którą można znaleźć tutaj
źródło
ReferenceError: err is not defined
próbuję uruchomić to wgulp-compass
zadaniu, czy coś mi brakuje?return gulp.src('app/**/*.js').pipe(concat(app.js)).pipe(gulp.dest('app/scripts');
. Kluczem jest zidentyfikowanie pierwszego zadania jako zależnego podczas definiowania drugiego zadania:gulp.task('two', ['one'], function() {...
Zadanie drugie będzie teraz czekać na zakończenie zadania pierwszego przed uruchomieniem.Wygenerowałem aplikację node / gulp za pomocą generatora Yeul generatora gulp-webapp . W ten sposób poradzono sobie z „czystą zagadką” (przekładając się na oryginalne zadania wymienione w pytaniu):
źródło
gulp.start()
, ta odpowiedź członka gulp wyjaśnia, że:gulp.start is undocumented on purpose because it can lead to complicated build files and we don't want people using it
(źródło: github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )coffee
zadanie zostało zakończone? Jeśli go niedevelop
coffee
run-sequence
kodem źródłowym:gulp.on('task_stop')
. Zobacz moją rozszerzoną odpowiedź, aby uzyskać szczegółowe informacje: stackoverflow.com/a/38818657/3027390sekwencja uruchamiania jest najbardziej przejrzystym sposobem (przynajmniej do wydania Gulp 4.0)
W przypadku sekwencji uruchamiania twoje zadanie będzie wyglądać następująco:
Ale jeśli (z jakiegoś powodu) wolisz go nie używać,
gulp.start
metoda pomoże :Uwaga: jeśli rozpoczniesz zadanie tylko bez odsłuchiwania wyniku,
develop
zadanie zakończy się wcześniej niżcoffee
, co może być mylące.Możesz także usunąć detektor zdarzeń, gdy nie jest potrzebny
Zastanów się, czy jest też
task_err
wydarzenie, którego możesz chcieć słuchać.task_stop
jest uruchamiany po pomyślnym zakończeniu, podczas gdytask_err
pojawia się, gdy wystąpi jakiś błąd.Możesz także zastanawiać się, dlaczego nie ma oficjalnej dokumentacji
gulp.start()
. Ta odpowiedź członka gulp wyjaśnia następujące rzeczy:(źródło: https://github.com/gulpjs/gulp/issues/426#issuecomment-41208007 )
źródło
Według dokumentów Gulpa:
Aby uruchomić sekwencję zadań synchronicznie:
gulp.src
),gulp.task
Aby poinformować zadanie o zakończeniu strumienia.gulp.task
.Zobacz poprawiony kod:
źródło
Miałem dokładnie ten sam problem i rozwiązanie okazało się dla mnie dość łatwe. Zasadniczo zmień kod na następujący i powinien on działać. UWAGA: powrót przed gulp.src zrobił dla mnie całą różnicę.
źródło
wypróbowałem wszystkie proponowane rozwiązania, wszystkie wydają się mieć własne problemy.
Jeśli faktycznie zajrzysz do źródła Orchestratora, szczególnie do
.start()
implementacji, zobaczysz, że jeśli ostatni parametr jest funkcją, będzie traktował go jako wywołanie zwrotne.Napisałem ten fragment do moich własnych zadań:
źródło
Przez chwilę szukałem tej odpowiedzi. Teraz mam to w oficjalnej dokumentacji łyka.
Jeśli chcesz wykonać zadanie przełknięcia po zakończeniu ostatniego, musisz zwrócić strumień:
źródło
Po prostu
coffee
uzależnij sięclean
idevelop
polegaj nacoffee
:Wysyłka jest teraz seryjna:
clean
→coffee
→develop
. Pamiętaj, żeclean
implementacja icoffee
implementacja muszą akceptować wywołanie zwrotne, „aby silnik wiedział, kiedy to nastąpi” :Podsumowując, poniżej znajduje się prosty wzorzec przełknięcia dla synchronicznych
clean
zależności, po których następują asynchroniczne zależności kompilacji :Gulp jest wystarczająco inteligentny, aby uruchamiać
clean
dokładnie raz nabuild
, bez względu na to, ilebuild
zależy od zależnościclean
. Jak napisano powyżej,clean
jest barierą synchronizacji, wtedy wszystkiebuild
zależności działają równolegle, a następniebuild
działają.źródło
Dla mnie nie było uruchomione zadanie minify po konkatenacji, ponieważ oczekuje ono skonkatowanych danych wejściowych i nie zostało wygenerowane kilka razy.
Próbowałem dodać do domyślnego zadania w kolejności wykonania i nie zadziałało. Działa po dodaniu tylko
return
dla każdego zadania i umieszczeniu w środku minifikacjigulp.start()
jak poniżej.Źródło http://schickling.me/synchronous-tasks-gulp/
źródło
Gulp i Node używają obietnic .
Możesz to zrobić:
Jeśli zwrócisz strumień gulp, możesz użyć
then()
metody, aby dodać wywołanie zwrotne. Alternatywnie możesz użyć natywnego węzła,Promise
aby stworzyć własne obietnice. Tutaj używamPromise.all()
jednego oddzwaniania, które jest uruchamiane, gdy wszystkie obietnice się spełnią.źródło
Spróbuj tego hacka :-) Błąd Gulp v3.x Hack for Async
Próbowałem wszystkich „oficjalnych” sposobów w Readme, nie działały one dla mnie, ale to zadziałało. Możesz także zaktualizować do wersji gulp 4.x, ale zdecydowanie nie polecam, ponieważ psuje tak wiele rzeczy. Możesz użyć prawdziwej obietnicy js, ale hej, to jest szybkie, brudne, proste :-) Zasadniczo używasz:
Sprawdź post!
źródło