Gulp: как составлять задачи последовательно?
Мне нужно было бы составить задачи gulp, последовательно обрабатывая разные источники, поскольку между ними есть зависимости.
на основе документации это должно быть сделано мои потоки слияния, но я не вижу способа заставить их упорядочить и сериализовать.
каков правильный способ моделирования этого в Gulp 3 ?
обычно я использую функции в качестве контейнеров для отдельных шагов сборки, а затем вызываю их из сборки и просмотра задачи:
function buildModule(module) {
var streams = [];
// step one
streams.push(
gulp.src(path.join('./modules', module, '*.js'))
// ... series of chained calls
);
// step two
streams.push(
gulp.src([TMP, ...])
// generate target also using some of the files from step one
);
return eventStream.merge(streams);
}
gulp.task('build:A', [], function () {
return buildModule('A');
});
gulp.task('watch:buildModule', [], function () {
gulp.watch('./modules/**/*.js', function (event) {
if (event.type === 'changed') {
return buildModule(path.basename(path.dirname(event.path)));
}
});
});
gulp.task('default', ['watch:buildModule'], function () {});
2 ответов
существует три способа сделать это.
1. Определение зависимых задач
Gulp позволяет разработчикам определять зависимые задачи, передавая массив имен задач в качестве вторых аргументов:
gulp.task('concat', function () {
// ...
});
gulp.task('uglify', ['concat'], function () {
// ...
});
gulp.task('test', ['uglify'], function () {
// ...
});
// Whenever you pass an array of tasks each of them will run in parallel.
// In this case, however, they will run sequentially because they depend on each other
gulp.task('build', ['concat', 'uglify', 'test']);
2. Использование run-sequence
вы также можете использовать выполнить-последовательность для последовательного выполнения массива задач:
var runSequence = require('run-sequence');
gulp.task('build', function (cb) {
runSequence('concat', 'uglify', 'test', cb);
});
3. Использование lazypipe
хотя Lazypipe является библиотекой для создания многоразовых трубопроводов, вы можно как-то использовать его для создания последовательных задач. Например:
var preBuildPipe = lazypipe().pipe(jshint);
var buildPipe = lazypipe().pipe(concat).pipe(uglify);
var postBuildPipe = lazypipe().pipe(karma);
gulp.task('default', function () {
return gulp.src('**/*.js')
.pipe(preBuildPipe)
.pipe(buildPipe)
.pipe(postBuildPipe)
.pipe(gulp.dest('dist'));
});
этот маленький модуль может помочь: трансляция-серия.
просто заменить eventStream.merge(streams)
С:
var series = require('stream-series');
// ...
return series(streams);