2015-02-09 126 views
2

我有兩套文件,我們稱它們爲basemodsmods文件覆蓋base文件,所以當我運行與base相關的吞噬任務時,我需要在之後直接運行mods任務。我的設置是這樣的:完成其他任務後運行gulp任務

gulp.task('base',function(){ 
    return gulp.src('base-glob') 
    .pipe(...) 
    .pipe(gulp.dest('out-glob')) 
}); 

gulp.task('mods',function(){ 
    return gulp.src('mods-glob') 
    .pipe(...) 
    .pipe(gulp.dest('out-glob')) 
}); 

所以我想在base任務完成運行mods任務。請注意,這與將base定義爲mods的依賴關係並不相同,因爲如果我只更改mods文件,則只需要運行mods任務。我不想使用插件。

我一直在閱讀有關回調函數和同步任務的其他建議的文檔,但似乎無法讓我的頭在附近。

+0

您有衝突的要求。你希望'mods'在'base'後面運行,但如果只有'mods'文件被改變,你只希望'mods'自己運行?這完全沒有意義。 – 2015-02-09 19:13:27

+0

對不起,我不清楚。我有兩個用例:當'base'文件改變時,我想運行'base'和'mods'。當'mods'文件改變時,我只想運行'mods'。 – nvioli 2015-02-09 19:17:24

+0

我認爲只是想確認一下。請參閱下面的答案。 – 2015-02-09 19:20:51

回答

6

我知道你不想使用插件,但gulp沒有辦法在沒有插件的情況下運行一系列任務。 Gulp 4 will,但與此同時,臨時解決方案是run-sequence插件。

gulp.task('all', function() { 
    runSequence('base', 'mods'); 
}); 

這可確保任務順序運行,而不是無序的依賴關係。

現在設置的手錶:

gulp.task('watch', function() { 
    gulp.watch('base-glob', ['all']); 
    gulp.watch('mods-glob', ['mods']); 
}); 

每當base-glob變化,一飲而盡將運行all任務,這將運行序列base然後mods

每當mods-glob發生變化,gulp將只運行mods任務。

這聽起來正確嗎?

+0

爲我工作,謝謝!值得注意的是有一個更新版本的** gulp-run-sequence **,它被稱爲[run-sequence](https://www.npmjs.com/package/run-sequence) – 2015-02-11 16:05:09

+0

謝謝,更新了答案 – 2015-02-11 17:33:48

0

runSequence有一些奇怪的錯誤,它一直抱怨我的任務沒有定義。

如果您查看Orchestrator源代碼,尤其是.start()實現,您將看到如果最後一個參數是一個函數,則它會將其視爲回調。

我寫這個片段對我自己的任務:

gulp.task('task1',() => console.log(a)) 
    gulp.task('task2',() => console.log(a)) 
    gulp.task('task3',() => console.log(a)) 
    gulp.task('task4',() => console.log(a)) 
    gulp.task('task5',() => console.log(a)) 

    function runSequential(tasks) { 
    if(!tasks || tasks.length <= 0) return; 

    const task = tasks[0]; 
    gulp.start(task,() => { 
     console.log(`${task} finished`); 
     runSequential(tasks.slice(1)); 
    }); 
    } 
    gulp.task("run-all",() => runSequential([ "task1", "task2", "task3", "task4", "task5"));