Как принудительно запускать вызовы gulp для синхронного запуска?
Я хочу, чтобы приведенные ниже вызовы gulp выполнялись синхронно, один за другим. Но они не следуют порядку.
Модуль run-sequence node здесь не помогает, так как я не пытаюсь запускать задачи gulp последовательно (т.е. имеет синтаксис аналогично gulp.task("mytask", ["foo", "bar", "baz"]
и т.д.), а скорее gulp "вызывает" последовательно, как показано ниже.
gulp.task("dostuff", function (callback) {
gulp
.src("...")
.pipe(gulp.dest("...");
gulp
.src("...")
.pipe(gulp.dest("...");
gulp
.src("...")
.pipe(gulp.dest("...");
callback();
});
Как заставить их запускать один за другим?
Ответы
Ответ 1
Вы можете использовать async как поток управления для ваших вызовов, чтобы получить их только в одной задаче, также избегая вас, чтобы получить "эффект пирамиды". Итак, что-то вроде этого должно быть полезно для вашего прецедента:
var async = require('async');
gulp.task('yeah', function (cb) {
async.series([
function (next) {
gulp.src('...')
.pipe(gulp.dest('...')
.on('end', next);
},
function (next) {
gulp.src('...')
.pipe(gulp.dest('...')
.on('end', next);
},
function (next) {
gulp.src('...')
.pipe(gulp.dest('...')
.on('end', next);
}
], cb);
});
Это также позволит вам обрабатывать некоторые ошибки и лучше ориентироваться в случае возникновения проблемы.
Ответ 2
Ну, это просто потоки, чтобы вы могли слушать конечное событие (Остерегайтесь пирамиды гибели!)
gulp.task("dostuff", function (callback) {
gulp
.src("...")
.pipe(gulp.dest("..."))
.on('end', function () {
gulp
.src("...")
.pipe(gulp.dest("..."))
.on('end', function () {
gulp
.src("...")
.pipe(gulp.dest("..."))
.on('end', callback);
});
});
});
Но это, вероятно, лучший шаблон для разбивки его на несколько задач, каждый из которых зависит от предыдущего.
Ответ 3
последовательность выполнения:
Запускает последовательность задач gulp в указанном порядке. Эта функция предназначен для решения ситуации, когда вы определили порядок выполнения, но не используйте или не можете использовать зависимости.
npm install -save-dev run-sequence
// runSequence will ensure this task will run the following tasks in the listed order
gulp.task('things-to-do', callback => runSequence(
'clean-up-workspace',
'copy-new-files',
'lint',
'minify',
'do-laundry',
'cook-dinner',
'bath-cat',
callback
));
https://www.npmjs.com/package/run-sequence
Ответ 4
Используйте синхронный режим для glob
Затем верните результат gulp.src:
gulp.task('render', function() {
var appJsFiles = _.map(glob.sync('src/**/*.js'), function(f) {
return f.slice(6);
});
// Render the file.
return gulp.src('src/template.html')
.pipe(template({
scripts: appJsFiles,
styles: ['style1.css', 'style2.css', 'style3.css']
}))
.pipe(gulp.dest(config.build_dir));
});
Ответ 5
вы можете добавить что-то подобное после последнего канала
.pipe(gulp.dest(FINAL_DEST))
.on('end', () => gulp.src(['build']) .pipe(clean()))