Gulp 4 个多个异步子任务

Gulp 4 multiple async subtasks

如何在 Gulp 任务中 运行 多个异步子任务?通常,此任务 运行s 并开始复制文件,但最后会抛出错误。

gulp.task('copy:default', () => {

  const fonts = gulp.src(['src/fonts/**/*'])
    .pipe(gulp.dest('dist/fonts'));
  const images = gulp.src(['src/images/**/*'])
    .pipe(gulp.dest('dist/images'));
  const scripts = gulp.src(['src/scripts/**/*'])
    .pipe(gulp.dest('dist/scripts'));

  return ['fonts', 'images', 'scripts']

});

我是这样使用的:

gulp.task('build', gulp.series('clean:dist', 'copy:default', 'sass'));

这个 return ['fonts', 'images', 'scripts'] 只是 return 一个字符串数组,这是不够的。

查看 merge-stream and https://mariusschulz.com/blog/merging-two-gulp-streams 实际 return 流。

const merge = require('merge-stream');

gulp.task('copy:default', () => {

  const fonts = gulp.src(['src/fonts/**/*'])
    .pipe(gulp.dest('dist/fonts'));
  const images = gulp.src(['src/images/**/*'])
    .pipe(gulp.dest('dist/images'));
  const scripts = gulp.src(['src/scripts/**/*'])
    .pipe(gulp.dest('dist/scripts'));

  // return ['fonts', 'images', 'scripts']
  return merge(fonts, images, scripts);

});

gulp.task('copy:default', () => {

  return merge(
    gulp.src(['src/fonts/**/*'])
      .pipe(gulp.dest('dist/fonts')),
    gulp.src(['src/images/**/*'])
      .pipe(gulp.dest('dist/images')),
    gulp.src(['src/scripts/**/*'])
      .pipe(gulp.dest('dist/scripts'))
  ); 
});

这是一个可行的解决方案:

gulp.task('copy:default', () => {
  const finalPromise = new Promise(finalResolve => {

    const fonts = new Promise(resolve => {
      gulp.src(['src/fonts/**/*'])
        .pipe(gulp.dest('dist/fonts'))
        .on('end', resolve);
    })

    const images = new Promise(resolve => {
      gulp.src(['src/images/**/*'])
        .pipe(gulp.dest('dist/images'))
        .on('end', resolve)
    })

    const scripts = new Promise(resolve => {
      gulp.src(['src/scripts/**/*'])
        .pipe(gulp.dest('dist/scripts'))
        .on('end', resolve);
    })

    Promise.all([fonts, images, scripts]).then(result => {
      finalResolve(result);
    });
  });

  return finalPromise;
});