2015-10-06 126 views
27

我意识到能够声明将在任务之前运行的依赖关系,例如,如何从其他任务运行吞噬任务?

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

任务'c'被调用后,任务'c'执行前,每次运行任务'a'和'b'。

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

回答

-5

有几个方法可以做到这一点: 第一招:只调用一个新的任务,呼吁其他:

gulp.task('foo', function() { 
    gulp.task('caller', ['bar']); // <- this calls the other existing task! 
} 
gulp.task('bar', function() { 
    //do something 
} 

第二,少清洁剂之一:咕嘟咕嘟是JavaScript,因此你只设置一些指令作为一个随机函数,然后调用它!

gulp.task('task', function() { 
    recurrent_task(); 
} 
gulp.task('task2', function() { 
    recurrent_task(); 
} 
function recurrent_task() { 
    //do something 
} 
+7

只是我或者这根本行不通? – Tomasz

+1

第一个不起作用 – StingyJack

+1

第一个建议只是注册一个吞咽任务,但没有回调函数,所以是的,它不会工作。 – joeycozza

42

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

这是简单,避免使用大口的。开始()。

+2

“将任务分解为函数,然后在其他任务中重用它们,如果需要”上述问题的一条建议 – Novellizator

+0

我刚安装了gulp并且此方法适用于我。但我会列出下面讨论的替代方案。 – Callat

+1

谢谢你节省了我的时间;它为我工作得很好! –

1

正如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秒]已完成 'lessToCss' 后13毫秒
  • [22点59分12秒]后的48毫秒已经结束 '默认'

对于总的61毫秒完成

方法2? - [23时03分24秒]启动 '默认' ...... - [23时03分24秒]后38毫秒

成品 '默认' 几乎一半在38毫秒

对于总差价23毫秒

现在为什么会出现这种情况?老实说,我不知道怎么说,但是让我们说方法2显然更具可读性,可维护性,甚至更快的选择。

只要您明白不要直接在lazypipe()内调用流,它们都易于编写。

+1

这对@ Novellizator的评论比我的介绍更复杂。我修改了我的答案,以包含一种替代方法。单独评估性能统计数据非常困难,尤其是在您运行的代码不同的情况下。如果lessToCss使用增量方法,则预计第二次运行会比第一次更快。 – JeffryHouser

0

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

如果你想:

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

你想:

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

这工作,因为所有的任务,以便开始,所以如果你没有做任何事情异步在“元-a“,它会在”b“开始之前结束。如果它是异步的,那么你需要更加明确:

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