2016-10-18 24 views
6

我從咕嘟咕嘟3升級到4,和我遇到了一個錯誤:這個gulp-concat和lazypipe的組合是如何使用gulp 4導致錯誤的?

The following tasks did not complete: build 
Did you forget to signal async completion? 

我明白它在說,但不明白爲什麼這個代碼是觸發它。

錯誤與否,任務完成(文件連接並寫入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()); 
}); 

任何意見讚賞!

回答

7

這是一個known issue當使用lazypipe與吞噬4,它不會在不久的將來修復。從這個問題引用:

OverZealous commented on 20 Dec 2015
As of now, I have no intention of making lazypipe work on Gulp 4.

至於我可以告訴這個問題是由吞掉4使用async-done其中有這麼一段有關其流支持的事實引起的:

Note: Only actual streams are supported, not faux-streams; Therefore, modules like event-stream are not supported.

當您使用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())); 

這大概就是爲什麼一飲而盡認爲第二流是「人造流」,而當流已完成不正確檢測的原因。

此時您唯一的選擇是某種解決方法。最簡單的解決辦法(不需要任何額外的軟件包)是隻需添加一個回調函數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); 
}); 

另外,添加任何.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()); 
}); 
+0

感謝明確和詳細的解釋,真的很感謝! – goodforenergy

相關問題