【问题标题】:es.merge usage in gulp: Object #<Stream> has no method 'end'es.merge 在 gulp 中的用法:对象 #<Stream> 没有方法 'end'
【发布时间】:2014-06-09 11:09:51
【问题描述】:

我正在努力让两条并行处理路线在 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/'))
        ;
});

我发现了一个建议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 流没有广泛的了解,所以我无法确定这个问题的原因。 我的 Node 版本是 0.10.28,gulp 3.6.2,event-stream 是 3.1.5

【问题讨论】:

    标签: node.js gulp event-stream


    【解决方案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/'))
        ;
    });
    

    【讨论】:

    • 谢谢。实际上我最终以类似的方式解决了这个问题,将任务分成三个('build_standard'、'build-debug'和'build_min')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多