在进入下一个任务之前,让大嘴巴同步写入文件

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'... 

但是,尽pipe反应任务已经完成,它应该写入操作系统的文件还没有完成。 我注意到,如果我把一个睡眠声明在浏览器捆绑命令然后它按预期工作,但是这对我来说似乎有点哈克。

如果我希望反应任务不被考虑完成,直到文件(从gulp.dest)被同步写入磁盘,我将如何做?

你需要一个return语句:

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

有了这个我所有的写操作都是在处理下一个任务之前完成的。

遇到同样的问题。 假设有两个任务,第一个和第二个。 第二次运行后第一。 第一个任务生成一些文件,这些文件将由第二个任务读取。 使用依赖不能确保第二个任务可以find生成的文件。

我必须明确地使用pipe道上donecallback让第二个只在第一个真正完成之后才开始。

 //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技巧,Second将永远不会findFirst生成的文件。 下面显示了我所尝试的,第二个任务可以通过调用gulp First手工find生成的文件,然后调用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(); } 

被接受的答案是现货,但按照https://github.com/gulpjs/gulp/issues/899 ,在3.x分支的gulp中,你不能在没有额外的特别酱的情况下依赖它:

 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)因为在scripts任务完全parsing之前, tests任务将不会find由scripts任务创build的文件)