Как запустить задачу gulp из другой задачи?
Мне известно о возможности объявлять зависимости, которые будут выполняться перед задачей, например
gulp.task('a', () => {});
gulp.task('b', () => {});
gulp.task('c', ['a', 'c'], () => {});
Задачи "a" и "b" будут запускаться каждый раз после вызова задачи "c" и перед выполнением задачи "c".
Однако, как программно вызывать произвольную задачу из gulp.task
?
Ответы
Ответ 1
Я сделал это с помощью gulp.start(); например:
gulp.task('test1', function(){
gulp.start('test2');
})
gulp.task('test2', function(){
// do something
})
Я использовал gulp 3.9.1, если это имеет значение. Похоже, gulp.start() может быть удален или устарел; но этого еще не произошло.
Обновление
Если бы я мог разбить все на отдельные функции, как предположил Novellizator, это было бы примерно так:
function doSomething(){
// do something
}
gulp.task('test1', function(){
doSomething();
})
gulp.task('test2', function(){
doSomething();
})
Это просто и позволяет избежать использования gulp.start().
Ответ 2
Из Gulp 4+ я обнаружил, что это хорошо работает в качестве замены gulp.start:
const task1 = () => { /*do stuff*/ };
const task2 = () => { /*do stuff*/ };
// Register the tasks with gulp. They will be named the same as their function
gulp.task(task1);
gulp.task(task2);
...
// Elsewhere in your gulfile you can run these tasks immediately by calling them like this
(gulp.series("task1", "task2")());
// OR
(gulp.parallel("task1", "task2")());
Ответ 3
В общей теме "не надо" от других ответов, это зависит от того, что вы делаете.
Если вы думаете:
gulp.task("a", () => {
doSomethingInstant()
return doTaskB()
})
Вы хотите:
gulp.task("meta-a", () => {
doSomethingInstant()
})
gulp.task("a", ["meta-a", "b"])
Это работает, потому что все задачи запускаются по порядку, поэтому, если вы не делаете ничего асинхронного в "мета-а", оно заканчивается до начала "b". Если это асинхронно, тогда вам нужно быть более явным:
gulp.task("meta-a", () => {
return doSomethingAsync()
})
function taskB() {
// Original task B code...
}
gulp.task("b", taskB)
gulp.task("a", ["meta-a"], taskB)
Ответ 4
В связанной заметке вы можете инициировать задачи, используя gulp.series
или gulp.parallel
в gulp.parallel
v4. Хотя он не является прямой заменой gulp.start
, он достигает той же цели.
Пример:
До v4
gulp.task('protractor', ['protractor:src']);
После v4
gulp.task('protractor', gulp.series('protractor:src'));
Ответ 5
Как заявил ранее ДжеффриХаузер, использование следующего метода работает, но устарело и будет удалено в будущих версиях. Я просто попытался сделать следующее на 3.9.1, и он отлично работает.
код:
// Variables
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
// Task to compile less -> css: Method 1- The bad way
gulp.task('default', function(){
gulp.src('src/*.less')
gulp.start('lessToCss');
});
gulp.task('lessToCss', function() {
gulp.src('src/*.less')
.pipe(less())
.pipe(gulp.dest('src/main.css'));
});
Второй способ, упомянутый в комментарии Novellizator:
"Разбивайте задачи на функции, затем повторно используйте их в других задачах, если вам нужно" посоветоваться с вышеупомянутой проблемой "
Я делаю это с помощью lazypipe() https://www.npmjs.com/package/lazypipe
код:
// Variables
var gulp = require('gulp');
var less = require('gulp-less');
var watch = require('gulp-watch');
var lazypipe = require('lazypipe');
var fixMyCSS = lazypipe()
.pipe(less); // Be CAREFUL here do not use less() it will give you an errror
// Task to compile less -> css: Method 2 - The nice way
gulp.task('default', function(){
//gulp.start('lessToCss');
gulp.src('src/*.less')
.pipe(fixMyCSS())
.pipe(gulp.dest('src/main.css'));
});
Краткое сравнение
Метод 1 дает следующее:
- Запуск "по умолчанию" ...
- [22:59:12] Начиная "lessToCss"...
- [22:59:12] Закончено "lessToCss" после 13 мс
- [22:59:12] Закончено "по умолчанию" через 48 мс
В общей сложности 61 мс для завершения
Способ 2?
- [23:03:24] Запуск 'default'...
- [23:03:24] Закончено "по умолчанию" после 38 мс
Практически половина в 38 мс
Для общей разницы 23 мс
Теперь, почему это так? Я честно не знаю достаточно о gulp, но скажу, что метод 2, несомненно, более читабельный, поддерживаемый и даже более быстрый выбор.
Они легко записываются до тех пор, пока вы не понимаете, что вы не вызываете поток непосредственно внутри lazypipe()
.
Ответ 6
Лучший способ сформировать меня:
task('task1', () => {
// Buy potatoes
});
task('task2', ['task1'], () => {
// Cut potatoes
});
Результатом задачи2 будет: купить картошку и порезать картошку
Ответ 7
Есть несколько способов сделать это:
Первый: просто вызовите вызов новой задачи для другого:
gulp.task('foo', function() {
gulp.task('caller', ['bar']); // <- this calls the other existing task!
}
gulp.task('bar', function() {
//do something
}
Второй, менее чистый: Gulp - это Javascript, поэтому вы просто устанавливаете пару инструкций как случайную функцию и называете ее!
gulp.task('task', function() {
recurrent_task();
}
gulp.task('task2', function() {
recurrent_task();
}
function recurrent_task() {
//do something
}