Gulp:我如何管理永不完成的任务?

时间:2014-06-17 23:45:04

标签: node.js stream gulp browserify watchify

我试图为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管道

2 个答案:

答案 0 :(得分:0)

您正在以错误的方式使用,当您完成文件('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插件,当它们发生变化时会发出文件?

答案 1 :(得分:0)

这是一个非常糟糕的主意。并不是gulp中的所有东西都需要成为插件,特别是,bro​​werify和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();
});