如何创建参数化和可重用的 gulp 任务

ska*_*ace 4 node.js gulp

有没有办法使这个通用到我可以拥有它的一个副本并将配置项和文件列表传递到其中而不是为每个文件/配置组合复制它的地步?

我很想有类似的东西

gulp.task('foo_test', function (cb) {
   run_tests(files.foo_list, config.fooCoverage);
   cb();
}
Run Code Online (Sandbox Code Playgroud)

注意潜在的怪事在代码中我使用lazypipe大口的负载插件完整的文件在这里

// test the server functions and collect coverage data
gulp.task('api_test', function (cb) {
    gulp.src(files.api_files)
      .pipe(istanbulPre())
      .on('end', function () {
          gulp.src(files.api_test_files)
            .pipe(mochaTask())
            .pipe(istanbulAPI())
            .on('end', cb);
      });
});

var istanbulAPI = lazypipe()
  .pipe(plugins.istanbul.writeReports, config.apiCoverage);

config =  {
   apiCoverage: {
        reporters: ['json'],
        reportOpts: {
            json: {
                dir: 'coverage',
                file: 'coverage-api.json'
            }
        }
    },
Run Code Online (Sandbox Code Playgroud)

Sve*_*ung 5

Gulp 只是 JavaScript。

您可以像往常一样编写普通的旧常规函数:

function run_tests(srcFiles, srcTestFiles, coverageConfig, cb) {
  var istanbul = lazypipe()
    .pipe(plugins.istanbul.writeReports, coverageConfig);

  gulp.src(srcFiles)
    .pipe(istanbulPre())
    .on('end', function () {
       gulp.src(srcTestFiles)
         .pipe(mochaTask())
         .pipe(istanbul())
         .on('end', cb);
     });
}

gulp.task('unit_test', function (cb) {
   run_tests(files.lib_files, files.unit_test_files, config.unitCoverage, cb);
});

gulp.task('api_test', function (cb) {
   run_tests(files.api_files, files.api_test_files, config.apiCoverage, cb);
});
Run Code Online (Sandbox Code Playgroud)

请注意,回调cb只是传递给run_tests函数的另一个参数。如果在调用之后立即调用run_tests它,则会在异步代码run_tests实际完成之前向 gulp 发出任务完成信号。