那个gulp-concat和lazypipe的组合怎么样使用gulp 4导致错误?

goo*_*rgy 11 javascript build-tools gulp gulp-concat gulp-4

我正在从Gulp 3升级到4,我遇到了一个错误:

The following tasks did not complete: build
Did you forget to signal async completion?
Run Code Online (Sandbox Code Playgroud)

我明白它在说什么,但无法理解为什么这段代码会触发它.

错误与否,任务完成(文件连接并写入dest).在没有lazypipe的情况下执行相同的代码不会导致错误,并且删除lazypipe中的串联也可以修复错误.

将整个事物包装在创建流的东西(如合并流)中可以解决问题.我想有关gulp-concat和lazypipe之间的交互的一些事情是阻止正确返回流.

这是(简化)任务:

gulp.task('build', function() {
    var dest = 'build';

    var buildFiles = lazypipe()
        .pipe(plugins.concat, 'cat.js') // Task will complete if I remove this
        .pipe(gulp.dest, dest);

    // This works
    // return gulp.src(src('js/**/*.js'))
    //     .pipe(plugins.concat('cat.js'))
    //     .pipe(gulp.dest(dest));

    // This doesn't (unless you wrap it in a stream-making function)
    return gulp.src(src('js/**/*.js'))
        .pipe(buildFiles());
});
Run Code Online (Sandbox Code Playgroud)

任何建议赞赏!

Sve*_*ung 12

当与gulp 4一起使用时,这是一个已知问题,lazypipe并且不会在不久的将来修复它.从那个问题引用:

OverZealous评论于2015年12月20日
截至目前,我无意在Gulp 4上制作lazypipe.

据我所知,这个问题是由gulp 4使用的async-done,这说明了它的流支持:

注意:仅支持实际流,而不支持虚假流; 因此,event-stream不支持类似的模块.

当您使用lazypipe()最后一个管道时,您获得的是一个流,它在使用gulp中的流时通常没有很多属性.您可以通过记录流来自行查看:

// console output shows lots of properties
console.log(gulp.src(src('js/**/*.js'))
  .pipe(plugins.concat('cat.js'))
  .pipe(gulp.dest(dest))); 

// console output shows much fewer properties
console.log(gulp.src(src('js/**/*.js'))
  .pipe(buildFiles())); 
Run Code Online (Sandbox Code Playgroud)

这可能就是为什么gulp认为第二个流是"虚假流"并且没有正确检测流何时完成的原因.

此时您唯一的选择是某种解决方法.最简单的解决方法(不需要任何其他软件包)只是cb向您的任务添加回调函数并监听'end'事件:

gulp.task('build', function(cb) {
  var dest = 'build';

  var buildFiles = lazypipe()
   .pipe(plugins.concat, 'cat.js') 
   .pipe(gulp.dest, dest);

  gulp.src(src('js/**/*.js'))
   .pipe(buildFiles())
   .on('end', cb);
});
Run Code Online (Sandbox Code Playgroud)

或者,添加任何.pipe()buildFiles()应该修复此问题,即使实际上没有做任何事情,例如gutil.noop():

var gutil = require('gulp-util');

gulp.task('build', function() {
  var dest = 'build';

  var buildFiles = lazypipe()
    .pipe(plugins.concat, 'cat.js') 
    .pipe(gulp.dest, dest);

  return gulp.src(src('js/**/*.js'))
    .pipe(buildFiles())
    .pipe(gutil.noop());
});
Run Code Online (Sandbox Code Playgroud)