我支持使用gulp的构建过程并尝试解决问题。为了解决这个问题,我想知道在单个gulp任务中多次调用gulp.src()。pipe()。dest()的代码是否合法且编写正确。
更确切地说,我想知道gulp.src()。pipe()。dest()是否在下一个javascript行之前完成,该行再次调用gulp.src()。pipe()。dest()。
代码如下:
gulp.src(getSrcFiles())
.pipe(dostuff)
.pipe(dostuff2)
.dest('temp');
// will the above copy complete before I try doing substitutions
gulp.src('temp/**')
.pipe(mySubstitutions)
.dest('temp')
gulp.src('temp/**')
.dest('dist')
问题是gulp.src().pipe().pipe().dest()
的第一个管道是否要在对在第一个管道中复制的文件执行一些变量替换的下一行之前完成?
我在https://gulpjs.org/API.html#gulp-dest-path-options的gulp文档中没有找到答案。
我发现未能回答我问题的其他一些问题是:
Q.js Promises in Gulp Loop(未回答,但引发了类似问题)。
How does gulp treat the Promise of a then()?(类似的问题,,没有答案:-))
更多问题,但没有答案...我有一种直觉,我想在解决后自己回答这个问题,然后我将能够回答其他一些问题。
What does Gulp "done" method do?是一个很棒的问答,它将帮助我理解gulp及其如何确保任务的顺序。 gulp npm运行顺序文档也非常有用,请参阅https://www.npmjs.com/package/run-sequence。
更新:我发现其他人将此举报为问题。
答案 0 :(得分:0)
这是我一直在寻找的答案:
将gulp.src()。pipe()。dest()在下一个javascript行之前完成,该JavaScript行再次调用gulp.src()。pipe()。dest()。< / strong>否。流管道已启动,但不一定要在运行下一个javascript行时完成。
您可以在单个gulp任务中使用多个gulp.src().pipe().dest()
吗?是,但是您必须以特殊方式编写gulp任务来处理该任务(如下所示)。
以下代码显示如何编写一个gulp任务,该任务将复制多个gulp.src()。dest()。它的工作方式是将gulp.src()。pipe()流转换为Promise,然后使用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();
});
});
我没有想到。功劳归于https://github.com/gulpjs/gulp/issues/1181#issuecomment-126694791的TySound。
重要的代码是这种模式:
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();
});