gulp.src().pipe().dest() 是否在下一行之前完成?我可以多次调用 gulp.src().pipe().dest() 吗?

Pat*_*atS 1 promise gulp

我支持使用 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 以及它如何确保任务的顺序,Gulp“完成”方法是做什么的?。gulp npm run-sequence 文档也非常有用,请参阅https://www.npmjs.com/package/run-sequence

更新:我发现其他人报告了这个问题。

Pat*_*atS 7

这就是我一直在寻找的答案:

  • 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)