Это ответ, который я искал:
Завершит ли gulp.src (). Pipe (). Dest () до следующей строки JavaScript, которая делаетеще один вызов gulp.src (). pipe (). dest (). Нет. Потоковый конвейер запускается, но не обязательно завершается при запуске следующей строки JavaScript.
Можете ли вы использовать несколько gulp.src().pipe().dest()
в одной задаче gulp? Да, но вы должны написать задачу gulp особым образом, чтобы справиться с этим (показано ниже).
Следующий код показывает, как написать задачу gulp, которая делает несколько копий gulp.src (). Dest ().Это работает так: конвертировать поток gulp.src (). Pipe () в обещание, а затем использовать Promise.all (), чтобы дождаться завершения всех потоков, прежде чем сказать, что задача gulp завершена.
gulp.task('task', function (doneWithTaskCb) {
return Promise.all([
new Promise(function(resolve, reject) {
gulp.src(src + '/*.md')
.pipe(plugin())
.on('error', reject)
.pipe(gulp.dest(dist))
.on('end', resolve)
}),
new Promise(function(resolve, reject) {
gulp.src(src + '/*.md')
.pipe(plugin())
.on('error', reject)
.pipe(gulp.dest(dist))
.on('end', resolve)
})
]).then(function () {
doneWithTaskCb();
});
});
Я не придумал это.Кредит предоставляется TySound по https://github.com/gulpjs/gulp/issues/1181#issuecomment-126694791.
Важным кодом является следующий шаблон:
new Promise(function(resolve, reject) {
gulp.src()
.pipe()
.pipe(gulp.dest(dist))
.end('end', resolve);
}
Этот код создает обещание, что после разрешения конвейер завершается.По сути, он преобразует «поток» в обещание.
Код, который вызывает doneWithTaskCb()
, важен, потому что именно так gulp знает, что текущая задача выполнена.
Promise.all( [ new Promise(), new Promise() ] )
.then(function() {
doneWithTaskCb();
});