2016-10-18 13 views
6

Я перехожу от Глоток 3 до 4, и я бегу в ошибку:Как насчет этой комбинации gulp-concat и lazypipe вызывает ошибку с помощью глотки 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 с gulp 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() как последний канал, который вы получаете, это поток, который не имеет большого количества свойств, которые вы обычно используете при работе с потоками в глотках. Вы можете увидеть это для себя, регистрируя потоки:

// 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