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