# 串行方式運行任務,亦即,任務依賴
默認情況下,任務會以最大的并發數同時運行 -- 也就是說,它會不做任何等待地將所有的任務同時開起來。如果你希望創建一個有特定順序的串行的任務鏈,你需要做兩件事:
* 給它一個提示,用以告知任務在什么時候完成,
* 而后,再給一個提示,用以告知某任務需要依賴另一個任務的完成。
舉個例子,我們假設你有兩個任務,"one" 和 "two",并且你明確的希望他們就以這樣的順序運行:
1. 在任務 "one" 中,你添加的一個提示,來告知何時它會完成。你可以傳入一個回調函數,然后在完成后執行回調函數,也可以通過返回一個 promise 或者 stream 來讓引擎等待它們分別地被解決掉。
2. 在任務 "two" 中,你添加一個提示,來告知引擎它需要依賴第一個任務的完成。
因此,這個例子將會是像這樣:
```
var gulp = require('gulp');
// 傳入一個回調函數,因此引擎可以知道何時它會被完成
gulp.task('one', function(cb) {
// 做一些事 -- 異步的或者其他任何的事
cb(err); // 如果 err 不是 null 和 undefined,流程會被結束掉,'two' 不會被執行
});
// 標注一個依賴,依賴的任務必須在這個任務開始之前被完成
gulp.task('two', ['one'], function() {
// 現在任務 'one' 已經完成了
});
gulp.task('default', ['one', 'two']);
// 也可以這么寫:gulp.task('default', ['two']);
```
另一個例子,通過返回一個 stream 來取代使用回調函數的方法:
```
var gulp = require('gulp');
var del = require('del'); // rm -rf
gulp.task('clean', function(cb) {
del(['output'], cb);
});
gulp.task('templates', ['clean'], function() {
var stream = gulp.src(['src/templates/*.hbs'])
// 執行拼接,壓縮,等。
.pipe(gulp.dest('output/templates/'));
return stream; // 返回一個 stream 來表示它已經被完成
});
gulp.task('styles', ['clean'], function() {
var stream = gulp.src(['src/styles/app.less'])
// 執行一些代碼檢查,壓縮,等
.pipe(gulp.dest('output/css/app.css'));
return stream;
});
gulp.task('build', ['templates', 'styles']);
// templates 和 styles 將會并行處理
// clean 將會保證在任一個任務開始之前完成
// clean 并不會被執行兩次,盡管它被作為依賴調用了兩次
gulp.task('default', ['build']);
```
- gulp 中文文檔
- 入門指南
- gulp API 文檔
- 編寫插件
- 指導
- 使用 buffer
- 使用 Stream 處理
- 測試
- FAQ
- gulp 技巧集
- 整合 streams 來處理錯誤
- 刪除文件和文件夾
- 使用 watchify 加速 browserify 編譯
- 增量編譯打包,包括處理整所涉及的所有文件
- 將 buffer 變為 stream (內存中的內容)
- 在 gulp 中運行 Mocha 測試
- 僅僅傳遞更改過的文件
- 從命令行傳遞參數
- 只重新編譯被更改過的文件
- 每個文件夾生成單獨一個文件
- 串行方式運行任務,亦即,任務依賴
- 擁有實時重載(live-reloading)和 CSS 注入的服務器
- 通過 stream 工廠來共享 stream
- 指定一個新的 cwd (當前工作目錄)
- 分離任務到多個文件中
- 使用外部配置文件
- 在一個任務中使用多個文件來源
- Browserify + Uglify2 和 sourcemaps
- Browserify + Globs
- 同時輸出一個壓縮過和一個未壓縮版本的文件
- 改變版本號以及創建一個 git tag
- Swig 以及 YAML front-matter 模板