2

2 つの並列処理ルートを gulp で動作させるのに苦労しています。私のコードは次のようになります。

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 の使用法にあるようです。それがなければ (1 つの処理パス)、すべてが期待どおりに機能します。残念ながら、私は node.js ストリームに関する広範な知識を持っていないため、この問題の原因を特定できません。Node の私のバージョンは 0.10.28、gulp 3.6.2、event-stream は 3.1.5 です。

4

1 に答える 1

3

es.merge適切な WriteStream ではないため、パイプのターゲットとして使用できません。実装はしますwrite()end()、受信ストリーム データに沿って転送するようには機能しませんが、アップストリーム ソースが終了すると、イベントes.mergeを処理しません。endこれが の意図した動作かどうかはわかりませんes.mergeが、少なくとも現在の実装では、ソースとしてのみ使用できます。

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

別の解決策は、タスクを 2 つの個別のタスクに分割し、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/'))
    ;
});
于 2014-06-13T06:32:49.413 に答える