Условное задание gulp внутри gulp.paralell() или gulp.series()

Слишком много информации об условиях задачи внутри каналов (например, плагин "gulp-if"). Однако на самом деле это не "условные задачи": это "условное использование плагинов", и одна задача может использовать несколько плагинов. Вот как условно выполнить задачу НЕ внутри трубы (например, внутри gulp.paralell())

Предположим, что имя задачи может содержать пробелы для обеспечения легкого для понимания значения задачи.

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

5 ответов

А как насчет этого (решение для Gulp 4)

      gulp.series(
  task1,
  ...(condition ? [task2] : [])
);

Прелесть 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();
  }
));

Для 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)

Это действительно просто. Нет необходимости во вспомогательной функции:

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

Подсказка заключается в вызове функции в последней строке - она ​​вернет скорректированную задачу gulp.parallel - я использую это для обработки аргументов командной строки (yargs)

ВНИМАНИЕ: это будет выполнено перед выполнением первой задачи и будет выполняться также, когда выполняется другая задача, кроме «Сборка». Просто имейте это в виду при реализации логики;)

У меня есть массив для плагинов, где я выполняю простой запрос If, а затем расширяю массив, см. Строку 199 здесь .

На основе Gulp 4.

Для процесса сборки я изменил Const на Let, а также запросил его с помощью If, вы можете увидеть здесь .

Другие вопросы по тегам