为什么一些Gulp流默认“流动”,而其他人没有?

时间:2014-10-05 19:48:31

标签: node.js stream pipe gulp

考虑这两个gulp任务:

gulp.task('src', function(done) {
  gulp.src('docs/*')
    .on('end', function() {
      console.log('ending');
      done();
    });
});

gulp.task('dest', function(done) {
  gulp.src('docs/*')
    .pipe(gulp.dest('temp'))
    .on('end', function() {
      console.log('ending');
      done();
    });
});

正在运行gulp dest的行为符合预期,输出:

[12:33:15] Using gulpfile ~/Projects/gulp-exit/gulpfile.js
[12:33:15] Starting 'dest'...
ending
[12:33:15] Finished 'dest' after 13 ms

但是,仅运行gulp src输出:

[12:31:11] Using gulpfile gulpfile.js
[12:31:11] Starting 'src'...

永远不会调用'end'回调。经过一些调试后,我认为dest任务中的流是flowing,而源任务中的流不是。{/ p>

通过调用src

显示stream.resume()任务明确流动
gulp.task('src', function(done) {
  gulp.src('docs/*')
    .on('end', function() {
      console.log('ending');
      done();
    })
    .resume();
});

给出预期的输出:

[12:46:52] Using gulpfile gulpfile.js
[12:46:52] Starting 'src'...
ending
[12:46:52] Finished 'src' after 11 ms

我已经看到了与插件相同的行为组合:gulp.destgulp-mocha似乎返回流动的流,gulp-loggergulp-gh-pages没有。

为什么行为不同?

2 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为有些流需要读取数据,有些则没有。

gulp.src('docs/*')返回一个可读的流,其中包含docs中每个文件的数据。只有从流中读取了所有数据后,end事件才会触发可读流。

通常情况下,你会把它传递给另一个自动执行此操作的流,但是因为你不需要使用:

gulp.task('src', function(done) {
  gulp.src('docs/*')
    .on('data', function() {})
    .on('end', function() {
      console.log('ending');
      done();
    });
});

或者您可以使用finish事件,我认为该事件等待所有数据都被推送到流中(即它已完成工作):

gulp.task('src', function(done) {
  gulp.src('docs/*')
    .on('finish', function() {
      console.log('ending');
      done();
    });
});

您的第二个gulp任务使用gulp.dest('temp')返回没有数据的流,因此只要流完成处理就会触发end

答案 1 :(得分:2)

不是为什么要回答,但我把stream-end模块拼凑起来以消除短期内的怪癖:

end = require('stream-end')

gulp.task 'logger', (done) ->
  gulp.src 'docs/*'
    .pipe logger()
    .pipe end ->
      console.log('ending')
      done()

无论上游是否流动,都会调用传递给end的回调。