我支持使用 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')
Run Code Online (Sandbox Code Playgroud)
问题是第一个管道是否会在下一行gulp.src().pipe().pipe().dest()对第一个管道中复制的文件执行一些变量替换之前完成?
我没有在https://gulpjs.org/API.html#gulp-dest-path-options的 gulp 文档中看到答案。
我发现没有回答我的问题的其他一些问题是:
Gulp Loop 中的 Q.js Promises(未回答,但提出了类似的问题)。
承诺解决后 gulp 运行序列(类似问题未回答)
gulp 如何处理 then() 的 Promise?(类似的问题,蟋蟀,没有答案:-))
更多问题但没有答案...我有一种直觉,在我弄清楚之后我会自己回答这个问题,然后我就能够回答其他一些问题。
一个很好的问题和答案将帮助我理解 gulp 以及它如何确保任务的顺序,Gulp“完成”方法是做什么的?。gulp npm run-sequence 文档也非常有用,请参阅https://www.npmjs.com/package/run-sequence。
更新:我发现其他人报告了这个问题。
这就是我一直在寻找的答案:
gulp.src().pipe().dest() 将在下一个 javascript 行再次调用 gulp.src().pipe().dest() 之前完成。 不会。当下一个 javascript 行运行时,流管道已启动,但不一定完成。
gulp.src().pipe().dest()您可以在单个 gulp 任务中使用多个吗? 是的,但是您必须以特殊的方式编写 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();
});
});
Run Code Online (Sandbox Code Playgroud)
我没有想出它。功劳归于 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);
}
Run Code Online (Sandbox Code Playgroud)
该代码创建了一个承诺,即当它解析时管道就完成了。所以本质上,它把“流”转换成一个承诺。
调用的代码doneWithTaskCb()很重要,因为这是 gulp 知道当前任务已完成的方式。
Promise.all( [ new Promise(), new Promise() ] )
.then(function() {
doneWithTaskCb();
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1744 次 |
| 最近记录: |