Подтвердить что ты не робот

Как запустить задачу gulp из другой задачи?

Мне известно о возможности объявлять зависимости, которые будут выполняться перед задачей, например

gulp.task('a', () => {});
gulp.task('b', () => {});
gulp.task('c', ['a', 'c'], () => {});

Задачи "a" и "b" будут запускаться каждый раз после вызова задачи "c" и перед выполнением задачи "c".

Однако, как программно вызывать произвольную задачу из gulp.task?

4b9b3361

Ответ 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
}