2

关于管道内条件任务的太多信息(例如“gulp-if”插件)。但是,实际上它不是“条件任务”:它是“有条件的插件使用”,一个任务可以使用多个插件。以下是如何有条件地运行不在管道内的任务(例如,在里面gulp.paralell()

假设任务名称可以包含空格以提供易于理解的任务含义。

gulp.task('Build', gulp.paralell(
    'Preprocess HTML',
    'Prepeocess styles',
    done => {
        if(checkSomeCondition()){
            runTask('some Task') // but how?
        }
        else {
            done();
        }
    }
))
4

4 回答 4

1

对于 gulp 4,首先创建这个辅助函数:

function gulpTaskIf(condition, task) {
  task = gulp.series(task) // make sure we have a function that takes callback as first argument
  return function (cb) {
    if (condition()) {
      task(cb)
    } else {
      cb()
    }
  }
}
  • 作为它的第一个参数,这个帮助器接受一个函数形式的条件。条件函数在任务开始执行时运行,因此您可以在条件函数中检查先前步骤的输出。
  • 第二个参数指定要运行的任务,可以是相同的值gulp.parallel()gulp.series()作为参数接受,即字符串、函数引用或来自另一个gulp.parallel()或的返回值gulp.series()
  • 返回一个可以gulp.task()作为第二个参数或作为gulp.parallel()gulp.series()调用的参数传递给的函数。

示例(第一个匹配问题):

  • 嵌入例如 gulp.parallel() 或 gulp.series(),按名称调用任务
gulp.task('Build', gulp.parallel(
    'Preprocess HTML',
    'Prepeocess styles',
    runTaskIf(checkSomeCondition, 'some Task')
))
  • 作为任务,按名称调用任务
function myTask() {
  return gulp.src(...)
    ...
    .dest(...)
}
gulp.task('my-task', myTask)
gulp.task('default', gulpTaskIf(
  function () {
    return Math.random() < 0.5; // example condition
  },
  'my-task')
  • 作为独立任务,通过函数引用调用任务
function myTask() {
  return gulp.src(...)
    ...
    .dest(...)
}
gulp.task('default', gulpTaskIf(() => Math.random() < 0.5, myTask)
  • 作为独立任务,调用 gulp.parallel() 或 gulp.series() 参考
const manyTasks = gulp.parallel(task1, task2, task3)
gulp.task('default', gulpTaskIf(
  function () {
    return Math.random() < 0.5;
  },
  manyTasks)
于 2020-01-22T13:34:47.417 回答
1

gulp4.0 的美妙之处在于您的任务可以只是函数,因此以下工作:

gulp.task('Preprocess HTML', function () {
  console.log("in Preprocess HTML");
  return gulp.src('./');
});

您可以使用上述版本(“旧方式”)或下面的新方式。

我在这里展示了两个使用两个版本的任务,但我个人不会混合使用它们。

// function PreprocessHTML() {
//   console.log("in Preprocess HTML");
//   return gulp.src('./');
// }

function PreprocessStyles() {
  console.log("in Preprocess styles");
  return gulp.src('./');
}

function testTaskTrue() {
  console.log("in testTaskTrue");
  return gulp.src('./');
}

function testTaskFalse() {
  console.log("in testTaskFalse");
  return gulp.src('./');
}

function checkSomeCondition() {
  console.log("in checkSomeCondition");
  return false;
}

//    Again, I definitely wouldn't mix the two versions of tasks as shown below.
//    Just here for demonstration purposes.

gulp.task('test', gulp.parallel( 'Preprocess HTML',  PreprocessStyles,
  done => {
    if (checkSomeCondition()) {

        // so testTaskTrue can be any gulp4.0 task, easy to call since it just a function

      testTaskTrue();
    }
    else {
      testTaskFalse();
    }
    done();
  }
));
于 2018-06-29T21:26:53.703 回答
0

这真的很简单。不需要辅助功能:

gulp.task('Build', function() {
  const tasks = ['Preprocess HTML', 'Preprocess styles'];
  if(checkSomeCondition()) tasks.push('some Task');
  return gulp.parallel(tasks);
}());

线索是在最后一行调用函数——它将返回一个调整后的 gulp.parallel 任务——我正在使用它来处理命令行参数(yargs)

警告:这将在执行第一个任务之前执行,并且在运行“构建”以外的其他任务时也会执行。在实现逻辑时,请记住它;)

于 2021-08-19T09:41:51.900 回答
0

我有一个插件数组,我在其中进行简单的 If 查询,然后展开数组,请参见此处的第 199 行。

基于 Gulp 4。

对于构建过程,我将 Const 更改为 Let 并使用 If 进行了查询,您可以在此处查看

于 2021-06-21T14:02:55.153 回答