2015-10-06 347 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) 
相關問題