考虑这两个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.dest和gulp-mocha似乎返回流动的流,gulp-logger和gulp-gh-pages没有。
为什么行为不同?
答案 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的回调。