2014-07-07 23 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(); 
}