Использование es.merge в gulp: у объекта #<Stream> нет метода end
Я изо всех сил пытаюсь заставить два параллельных маршрута обработки работать в глотке. Мой код выглядит так:
gulp.task('build', function(){
return gulp.src(src,{cwd:srcDir})
.pipe(concat('sdk.js', {newLine:'\n\n'}))
.pipe(gulp.dest('dist/'))
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(es.merge(
gulp.src('dist/sdk.js')
.pipe(preprocess({context:{debug:true}}))
.pipe(rename('sdk.debug.js')),
gulp.src('dist/sdk.js')
.pipe(preprocess({context:{}}))
.pipe(uglify())
.pipe(rename('sdk.min.js'))
))
//some more processing
.pipe(gulp.dest('dist/'))
;
});
Я нашел здесь предложение, что такой способ разветвления и объединения потоков должен работать. Однако я получаю ошибку:
stream.js:79
dest.end();
^
TypeError: Object #<Stream> has no method 'end'
at Stream.onend (stream.js:79:10)
at Stream.EventEmitter.emit (events.js:117:20)
at end (C:\Users\user\Documents\proj\node-sdk\node_modules\gulp-
jshint\node_modules\map-stream\index.js:116:39)
at Stream.stream.end (C:\Users\user\Documents\proj\node-sdk\node
_modules\gulp-jshint\node_modules\map-stream\index.js:122:5)
at Stream.onend (stream.js:79:10)
at Stream.EventEmitter.emit (events.js:117:20)
at end (C:\Users\user\Documents\proj\node-sdk\node_modules\gulp-
jshint\node_modules\map-stream\index.js:116:39)
at queueData (C:\Users\user\Documents\proj\node-sdk\node_modules
\gulp-jshint\node_modules\map-stream\index.js:62:17)
at next (C:\Users\user\Documents\proj\node-sdk\node_modules\gulp
-jshint\node_modules\map-stream\index.js:71:7)
at C:\Users\user\Documents\proj\node-sdk\node_modules\gulp-jshin
t\node_modules\map-stream\index.js:85:7
Кажется, что проблема заключается в использовании es.merge, так как без него (один путь обработки) все работает как положено. К сожалению, я не обладаю обширными знаниями о потоках node.js, поэтому не могу определить причину этой проблемы. Моя версия Node - 0.10.28, gulp 3.6.2 и event-stream - 3.1.5.
1 ответ
es.merge
не может использоваться в качестве цели канала, потому что это не правильный WriteStream. Это реализует write()
но нет end()
поэтому он будет работать для пересылки данных входящего потока, но когда закончится восходящий источник, es.merge
не обрабатывает end
событие. Я не знаю, является ли это предполагаемым поведением для es.merge
, но по крайней мере в его текущей реализации, он может использоваться только как источник.
https://github.com/dominictarr/event-stream/blob/master/index.js#L32
Альтернативным решением было бы разделить вашу задачу на две отдельные задачи и использовать зависимости gulp:
gulp.task('build-concat', function() {
return gulp.src(src,{cwd:srcDir})
.pipe(concat('sdk.js', {newLine:'\n\n'}))
.pipe(gulp.dest('dist/'))
.pipe(jshint())
.pipe(jshint.reporter('default'));
});
gulp.task('build', ['build-concat'], function() {
return es.merge(
gulp.src('dist/sdk.js')
.pipe(preprocess({context:{debug:true}}))
.pipe(rename('sdk.debug.js')),
gulp.src('dist/sdk.js')
.pipe(preprocess({context:{}}))
.pipe(uglify())
.pipe(rename('sdk.min.js'))
))
//some more processing
.pipe(gulp.dest('dist/'))
;
});