2014-07-07 24 views
15

gulpfile.js製作一飲而盡寫入文件上移動到下一個任務

gulp.task('browser-bundle', ['react'], function() { 
... 

}); 


gulp.task('react', function(){ 
    gulp.src(options.JSX_SOURCE) 
     .pipe(react()) 
     .pipe(gulp.dest(options.JSX_DEST)) 
}); 

前同步正如你可以看到我有依賴於反應任務的瀏覽器捆綁任務。我相信這個工程預期因爲在輸出我看到這一點:

[gulp] Running 'react'... 
[gulp] Finished 'react' in 3.43 ms 
[gulp] Running 'browser-bundle'... 

然而,儘管反應任務完成後,該文件的應該寫操作系統都還沒有應用。我注意到,如果我在瀏覽器捆綁命令中加入睡眠語句,那麼它就像預期的那樣工作,但是這對我來說似乎有點不合理。

如果我希望反應任務不被考慮完成,直到文件(從gulp.dest)被同步寫入磁盤,我該如何做?

回答

26

你需要一個return語句:

gulp.task('react', function(){ 
    return gulp.src(options.JSX_SOURCE) 
     .pipe(react()) 
     .pipe(gulp.dest(options.JSX_DEST)) 
}); 

有了這個我所有的寫操作都處理的下一個任務之前完成。

+0

哈,是的,我只是想出了自己。那麼,你仍然得到的積分,謝謝你回答 – asolberg

+0

@Rwam開發 - 你能夠提供一個鏈接,這是記錄在哪裏?從我讀的,正確的方法是以下內容:http://stackoverflow.com/a/26336022/984407 – aaaaaa

+1

@aaaaaa看看這個食譜:https://github.com/gulpjs/gulp/blob/master /docs/recipes/running-tasks-in-series.md在gulp任務中使用'return'會導致同步運行任務。沒有'return' ==異步。 –

0

接受的答案是現貨,但按照https://github.com/gulpjs/gulp/issues/899,在一飲而盡的3.X分支,你不能依賴沒有一點額外的特殊醬料的做到這一點:

var run = require('run-sequence'); 
var nodeunit = require('gulp-nodeunit'); 
var babel = require('gulp-babel'); 
var gulp = require('gulp'); 

/// Explicitly run items in order 
gulp.task('default', function(callback) { 
    run('scripts', 'tests', callback); 
}); 

/// Run tests 
gulp.task('tests', function() { 
    return gulp.src('./build/**/*.tests.js').pipe(nodeunit()); 
}); 

// Compile ES6 scripts using bable 
gulp.task('scripts', function() { 
    return gulp.src('./src/**/*.js') 
    .pipe(babel()) 
    .pipe(gulp.dest('./build')); 
}); 

通知明確使用的'run-sequence'模塊來強制任務一個接一個地運行。

(如果沒有運行,rm -rf build && gulp將導致OK: 0 assertions (0ms)因爲tests任務將無法找到由scripts任務創建的文件,因爲它啓動之前scripts任務完全解決)在這裏

1

大都會同樣的問題。假設有2個任務,第一個和第二個。第二次運行後第一次。 第一個任務生成一些文件,這些文件將由第二個任務讀取。使用依賴關係不能確保第二個任務能夠找到生成的文件。

我必須明確使用管道上的done回調讓第二個只在第一個真正完成之後開始。

//This approach works! 
gulp.task('First', function(done)) { 
    var subFolders = fs.readdirSync(somefolder)... 
    var tasksForFolders = subFolders.map(function(folder) { 
     return gulp.src('folder/**/*').sthtogeneratefiles(); 
    }); 
    tasksForFolders[tasksForFolders.length-1].on('end',done); 
    return tasksForFolders; 
} 

gulp.task('Second', ['First'],function() { 
    return gulp.src('generatedfolders/**/*').doth(); 
} 

沒有done招,二從未發現通過首先生成的文件。下面顯示了我嘗試的內容,第二個任務可以通過手動調用gulp First來查找生成的文件,然後隨後調用gulp Second

//This is the WRONG approach, just for demonstration!! 
gulp.task('First', function()) { 
    var subFolders = fs.readdirSync(somefolder)... 
    var tasksForFolders = subFolders.map(function(folder) { 
     return gulp.src('folder/**/*').sthtogeneratefiles(); 
    }); 
    return tasksForFolders; 
} 

gulp.task('Second', function() { 
    return gulp.src('generatedfolders/**/*').doth(); 
}