Gulp:我如何完成一项永远不会完成的任务



我正试图为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插件,它会在文件更改时发出文件?

相关内容

  • 没有找到相关文章