如何从另一个任务运行gulp任务?

问题描述 投票:53回答:7

我知道能够声明将在任务之前运行的依赖项的能力,例如

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

[任务'a'和'b'将在每次调用任务'c'之后且在执行任务'c'之前运行。

但是,如何在gulp.task中以编程方式调用任意任务?

gulp
7个回答
69
投票

我使用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()。


9
投票

从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")());

7
投票

关于其他答案中“不要”的一般主题,取决于您在做什么。

[如果您正在考虑:

gulp.task("a", () => {
    doSomethingInstant()
    return doTaskB()
})

您想要:

gulp.task("meta-a", () => {
    doSomethingInstant()
})
gulp.task("a", ["meta-a", "b"])

这是可行的,因为所有任务都是按顺序启动的,因此,如果您没有在“ meta-a”中执行任何异步操作,它将在“ b”开始之前完成。如果它是异步的,那么您需要更加明确:

gulp.task("meta-a", () => {
    return doSomethingAsync()
})
function taskB() {
    // Original task B code...
}
gulp.task("b", taskB)
gulp.task("a", ["meta-a"], taskB)

6
投票

关于相关说明,您可以使用gulp v4中的gulp.seriesgulp.parallel来启动任务。尽管它不是gulp.start的直接替代品,但可以达到相同的目的。

示例:

v4之前

gulp.task('protractor', ['protractor:src']);

v4之后

gulp.task('protractor', gulp.series('protractor:src'));

3
投票

如上述JeffryHouser所述,使用以下方法有效,但已弃用,在以后的版本中将其删除。我只是在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] 13毫秒后完成了'lessToCss'
  • [[22:59:12]在48毫秒后完成'默认']

完成总共[[61 ms

方法2?-[23:03:24]开始“默认” ...-[23:03:24] 38毫秒后完成“默认”

实际上是

38 ms]时的一半]

相差

23毫秒

现在为什么是这种情况?老实说,我对gulp不够了解,但可以说方法2显然是更易读,可维护甚至更快的选择。

只要您知道不要直接在lazypipe()中调用流,它们都很容易编写。


0
投票
形成我的最好方式是:

-6
投票
有两种方法可以做到这一点:第一个:只需为另一个调用新的任务调用:
© www.soinside.com 2019 - 2024. All rights reserved.