gulp順序執行任務

gulp順序執行任務

在gulp中定義多個任務,可能一個任務要依賴其他某個任務完全結束後才能開始進行,比如,我們先定義兩個任務,一個coffee任務,一個clean任務,coffee用於編譯coffee代碼到js代碼,clean用於清理已經編譯的代碼,在編譯之前先clean一下:

gulp.task('coffee', function() {
    gulp.src('server/coffee/*.coffee')
        .pipe(coffee())
        .pipe(gulp.dest('server/js'));
});
gulp.task('clean', function() {
    gulp.src(['server/js/*.js'])
        .pipe(clean());
});

在官方的文檔中找到如下方式,在coffee任務中添加一個參數,標記該任務所依賴的其他任務,依賴的任務先於該任務執行:

gulp.task('coffee',['clean'], function() {
    gulp.src('server/coffee/*.coffee')
        .pipe(coffee())
        .pipe(gulp.dest('server/js'));
});

即,在coffee任務中添加一個任務依賴數組,數組裏的任務clean要先執行,再執行任務coffee.
但是在實際操作中發現,如果文件特別多,還是會報錯:

events.js:85
      throw er; // Unhandled 'error' event
            ^
Error: ENOENT, stat '/home/coolcao/mycode/node/NutWeb/server/dao/blogDao.js'
  at Error (native)

這令我不解,網上各種搜,都說這樣做沒問題,但我這裏確實不行。
又不停的問了一下谷老師,最終找到問題了:
對’clean’定義的function而言,雖然函數本身已經執行完畢了,但是文件刪除操作可能仍在進行 — gulp任務中的操作大多數都是數據流(Stream)的操作,其操作進度與函數執行無關。
如果需要在文件徹底清理後纔開始執行’less’任務,則需要在’clean’任務中進行特殊編碼:令其返回最終的數據流(Stream)對象:

gulp.task('clean', function() {
    return gulp.src(['server/js/*.js'])
            .pipe(clean());
});

對於數據流而言,代碼語句的執行結束僅僅意味着數據操作的開始,唯一能確定數據操作結束的是最後一個數據流所觸發的end事件;因此,只有想辦法監聽到這個end事件,纔有可能實現真正意義上的任務依賴。而在任務定義的函數中返回最後一個數據流,是一個相對來說使用起來最方便的方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章