2014-09-29 55 views
5

我正在使用Gulp來收集前臺內容(通過gulp-front-matter插件),然後在彙總它之後,我將它保存到另一個文件中。在其他數據中,我保存了一堆CSS。下面是我對我的compileCSS任務:你是如何運行吞吐「結束」任務,但只在當前任務結束?

var collected = []; 

gulp.src('./client/**/*.html') 
    .pipe(frontMatter({ property: 'meta', remove: true })) 
    .pipe(through.obj(function(file, enc, callback) { 
     var css = file.meta; 
     collected.push(css); 
    })) 
    .pipe(gulp.dest('./build/templates')) 
    .on('end', function() { 
     var cssPath = ['build', 'assets', 'css', 'compiled.css']; 
     fs.writeFileSync(cssPath.join(path.sep), cssPath); 
    }) 

;

該任務按預期工作(注意,這是一個簡化版本)。一切都按預期工作,我得到一個compiled.css文件與所有的前端CSS。但是,我發現不僅需要在我的常規css文件中使用Prefixer,而且還需要在這個新的compiled.css中使用Prefixer。所以,我創建了一個prefix任務:現在

gulp.task('prefix', ['compileCSS', 'copy'], function() { 
    gulp.src('./build/assets/css/*.css') 
     .pipe(autoprefixer({ browsers: ['last 3 versions'] })) 
     .pipe(gulp.dest('build')) 
    ; 
}); 

,問題是,on('end'功能在所有的任務,不只是compileCSS任務結束運行。

我的問題是,有沒有辦法爲每個任務注入一個「結束」類型的任務?或者有沒有辦法以某種方式使用流(因爲最後一個任務不是實際的流並且沒有利用它,我不知道如何)。

+0

這不僅僅是因爲你沒有提供回調而同時運行嗎? https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-tasks-in-series.md – RichieAHB 2014-09-29 13:24:50

回答

9

這並不是說是問題的順序,我沒有回這創造競爭條件的流,以這樣的修復工作:

return gulp.src('./client/**/*.html') 
      .pipe(dosomething()); 
    \\ all other code 

我想這個問題是咕嘟咕嘟等待在啓動下一個事件之前要做的流。如果沒有返回流或承諾,Gulp只是簡單地執行任務,不會等待它完成。

+0

如果Gulp只是簡單地運行任務,並沒有等待它完成,我該如何抓住真正的目的? 我需要這樣,因爲如果我想在供應商注入後運行「應用程序」注入,我需要捕獲此事件。 – carmelolg 2017-02-02 08:54:43

7

您可以嘗試run-sequence

var runSequence = require('run-sequence'); 
gulp.task('mytask', function(cb) { 
    runSequence(
    ['parallel1', 'parallel2'], 
    'seq1', 
    'seq2', 
    cb 
); 
}); 

如果你想要的東西更符合您的gulpfile,你應該把它包括你的問題。

+1

它最終成爲一個問題,因爲我從來沒有返回任何意味着吞嚥的流從未知道任務完成的時間。 – antjanus 2014-09-29 17:08:23

+0

@antjanus您應該發佈答案並將其標記爲已接受。 – Florent 2014-09-30 07:15:08

+1

我必須等待至少2天才能接受我自己的回答,所以我快到了! :) – antjanus 2014-10-01 12:37:19