2014-06-09 3 views
2

나는 두 개의 병렬 처리 경로를 꿀꺽 마땅히 처리하는 데 어려움을 겪고 있습니다. 내 코드는 다음과 같습니다꿀꺽 꿀꺽 마시는에서 es.merge 사용 : 개체 # <Stream> '끝'방법이 없습니다

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/')) 
     ; 
}); 

나는 그런 포크 (fork)의 방법과 다음 병합 스트림이 작동해야한다는 제안 here을 발견했다. 그러나, 나는 오류를 얻을 :

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 스트림에 대한 광범위한 지식이 없으므로이 문제의 원인을 파악할 수 없습니다. 노드의 내 버전이 0.10.28, 꿀꺽 꿀꺽 3.6.2, 이벤트 스트림이 3.1.5입니다.

답변

3

es.merge은 적절한 WriteStream이 아니므로 파이프 대상으로 사용할 수 없습니다. write()을 구현하지만 end()을 구현하지 않으므로 들어오는 스트림 데이터를 따라 전달할 수 있지만 업스트림 소스가 완료되면 es.mergeend 이벤트를 처리하지 않습니다. 나는 이것이 es.merge에 대한 의도 된 행동인지는 모르겠지만 최소한 현재 구현에서는 소스로만 사용될 수 있습니다.

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/')) 
    ; 
}); 
+0

감사 :

https://github.com/dominictarr/event-stream/blob/master/index.js#L32

대체 솔루션은 두 개의 별도의 작업 및 사용 꿀꺽 꿀꺽 종속성으로 작업을 분할하는 것입니다. 나는 결국 이것을 비슷한 방식으로 해결했다. 그 작업을 세 가지 ('build_standard', 'build-debug'및 'build_min')로 나누었다. – mz8i