如何将对象传递给gulp任务以便能够同步运行该任务?

时间:2015-10-29 19:47:13

标签: javascript build gulp

我有两个gulp任务

gulp.task('build:dev', ['task1', task2', task3'], () => {
  doCssmin({'destination': ['file1', 'file2']});
});


gulp.task('build:prod', ['task1', task2', task3'], () => {
  doCssmin({'destination': ['file3', 'file4']});
});

现在我有cssMinbuild:dev之间共享的build:prod任务,因此我将其创建为与两者共享的功能。

function doCssmin(files) {
  _.each(files, function(val, key) {
    gulp.src(val)
    .pipe(minifyCss({compatibility: 'ie8'}))
    .pipe(rename(basename(key)))
    .pipe(gulp.dest(dirname(key)));
  });

}

doCssmin接受files参数build:devbuild:prod他们有不同的文件来缩小css。如果我运行build:devbuild:prod doCssmin将以异步方式运行。但doCssmin取决于task2

我的问题是如何将doCssmin提取到gulp任务并接受files参数,以便可以与build:devbuild:prod任务共享?

不确定它是否太混乱了?

1 个答案:

答案 0 :(得分:1)

昨天,我answered a question on making your Gulp tasks more DRY。我相信这个问题的很大一部分也适用于此。

要支持具有该循环的循环,您希望合并从gulp.src收到的流。使用the example here

gulp.task('test', function() {
  var bootstrap = gulp.src('bootstrap/js/*.js')
    .pipe(gulp.dest('public/bootstrap'));

  var jquery = gulp.src('jquery.cookie/jquery.cookie.js')
    .pipe(gulp.dest('public/jquery'));

  return merge(bootstrap, jquery);
});

对于数组,您可以使用Array.prototype.map将项目转换为流,然后合并所有这些:

function minifyCss(paths) {
  return merge.apply(this, paths.map(function (path) {
    gulp.src(path)
      .pipe(minifyCss({compatibility: 'ie8'}))
      .pipe(rename(basename(path)))
      .pipe(gulp.dest(dirname(path)));
  }));
}

gulp.task('test', function () {
  return minifyCss(['foo', 'bar']);
});