在进入下一个任务之前,让大嘴巴同步写入文件
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道上done
callback让第二个只在第一个真正完成之后才开始。
//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的文件)