Open FMRobot opened 10 years ago
Хорошая статья, спасибо. Хочу только посоветовать одну замечательную библиотеку - https://www.npmjs.org/package/run-sequence, которая предназначена именно для сложных последовательностей. У меня в проекте были случаи, когда задачи надо не только запускать параллельно/последовательно, но они при этом ещё могли и запускаться отдельно и с другими зависимостями, так что простое включение зависимости не помогало. А эта библиотека здорово выручила, хотя, конечно, есть много и других путей.
Вот пример вызова:
var runSequence = require('run-sequence'); return runSequence('clean', ['js', 'media', 'localize'], 'collect_garbage', callback);
выполнит clean, затем параллельно js, media, localize, а потом collect_garbage.
Или https://www.npmjs.org/package/gulp-sync Но вот только gulp умеет это все из коробки. Тогда зачем?
Присоединюсь к вопросу от @SilentImp и также добавлю, что с релизом gulp@4.0.0 система менеджемента тасков обретёт новую жизнь и станет ещё круче
Еще можно добиться синхронности выполнения таким образом:
var afterTask = function(){
gulp.src(...)
.pipe(...)
.pipe(gulp.dest(...));
};
gulp.task('some-task', function() {
gulp.src(..)
.pipe(...)
.pipe(gulp.dest(...))
.on('end', afterTask);
});
фу-фу так делать, событие end
не для этого. надо использовать run-sequence
для красивой синхронной очереди тасков. Если хотите на ваниле всё сделать, то можно и по обычному
// task мета-таск, так как будет ждать depTask, который, в свою очередь будет ждать anotherDepTask
gulp.task('first', ['depTask']);
// deptask будет ждать anotherDepTask
gulp.task('depTask', ['anotherDepTask'], function() {…});
// task без зависимостей
gulp.task('depTask', ['anotherDepTask'], function() {…});
Больше нравится строить последовательности тасков через run-sequence
:
var runSequence = require('run-sequence');
gulp.task('build', function(callback) {
runSequence('clean-build',
'images',
'css',
'html',
['copy-images','copy-fonts'],
callback);
});
Поддерживаю первый комментарий. run-sequence решает задачи без головной боли.
p.s. кэпа: не юзайте gulp.run(), т.к. он уже deprecated.
Похоже зависимости вызывают зависимости :) И это я не про gulp, а про то, что вроде бы зачем подключать что-то, что уж есть в коробке.
Подскажите, а как орзанизовать правильный callback после выполнения таска, не создавая для этого нового таска ? К примеру у меня gulp-jade после обработки каждого файла выдает notification и по нескольку раз перезагружает livereload?!
Пример таска: gulp.task 'jade', -> gulp.src paths.views .pipe plumber errorHandler: notify.onError "Error: <%= error.message %>" .pipe jade pretty: true .pipe gulp.dest paths.app .pipe connect.reload() .pipe notify message: "jade task complete" open: "http://localhost:#{config.port}"
А нельзя просто дождаться конца потока? var stream = gulp.src(...)...; stream.waitForEnd();
Берите https://github.com/OverZealous/run-sequence и не заморачивайтесь.