我正试图为watchify
编写一个gulp插件,允许我将文件管道到它。问题是,我的任务从来没有真正"完成",因为它坐在那里监视一堆文件,并在必要时重新构建。
那么我如何通过这个插件发送代码呢?
现在,我调用插件的任务被简化为:
gulp.src( '/path/to/js/*.js' )
.pipe( watchifyPlugin() )
.pipe( cfg.gulp.dest( '/path/to/build' ) )
我的watchifyPlugin
是:
module.exports = function( opts ){
return through.obj( function( file, enc, cb ){
// watchify file
self.push( data ); // whenever any .js files are updated
// never call cb()
}
}
现在这对于我的glob找到的第一个.js
文件工作得很好。任何其他文件从来没有真正得到我的插件,然而,我假设这是因为我从来没有调用cb()
。
我该怎么做呢?是否有一种方法可以在不调用cb()
的情况下继续写入流,这会关闭它,但仍然允许以前的管道继续?
换句话说:
- index.js
-
watchify()
- 管道到
dest()
很好,即使我一次又一次地调用self.push()
-
cb()
从未调用
-
- index2.js
-
watchify()
从未被调用,直到cb()
调用index.js
,但这"关闭"index.js
管道
-
这是一个非常糟糕的主意。并不是gulp中的所有东西都需要是插件,特别是browerify和watchify插件一直被禁止。(参见https://github.com/gulpjs/plugins/blob/master/src/blackList.json)。如果您想运行watchify,只需直接使用watchify。从https://github.com/gulpjs/gulp/blob/master/docs/recipes/fast-browserify-builds-with-watchify.md:
var gulp = require('gulp');
var source = require('vinyl-source-stream');
var watchify = require('watchify');
gulp.task('watch', function() {
var bundler = watchify('./src/index.js');
// Optionally, you can apply transforms
// and other configuration options on the
// bundler just as you would with browserify
bundler.transform('brfs');
bundler.on('update', rebundle);
function rebundle () {
return bundler.bundle()
.pipe(source('bundle.js'))
.pipe(gulp.dest('./dist'))
}
return rebundle();
});
您正在以错误的方式使用through,当您完成文件('data'事件)时,您必须调用回调。然而,关闭流的不是cb()
,它发出的是end
。
您可以延迟结束事件,并继续调用this.push
发送新文件。
var Through = require('through2').obj;
var my_plugin = function() {
var last_file = null; // as an example, last emitted file
function handle_data = function(file, enc, done) {
this.push(file); // emit the file
this.push(file); // just for kicks, emit it again
last_file = file;
done(); // done handling *this* file
}
function handle_end = function(done) {
if(last_file) this.push(last_file); // emit the last file again
done(); // handled the 'end' event
}
return Through(handle_data, handle_end);
}
这将在处理下一个文件之前触发每个文件两次,然后当它处理完所有文件(收到end
事件)时,它再次触发最后一个文件,然后触发end
事件。
但是为什么你不使用gulp.watch
,只是在某些事情发生变化时再次运行任务?或者甚至使用gulp-watch插件,它会在文件更改时发出文件?