Javascript 使gulp在继续执行下一个任务之前同步写入文件

Javascript 使gulp在继续执行下一个任务之前同步写入文件,javascript,node.js,gulp,Javascript,Node.js,Gulp,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)) }); 如您所见,我有浏览器捆绑任务,具体取决于react任务。我相信这是可以预期的,因为在输出中我

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))
});
如您所见,我有浏览器捆绑任务,具体取决于react任务。我相信这是可以预期的,因为在输出中我看到:

[gulp] Running 'react'...
[gulp] Finished 'react' in 3.43 ms
[gulp] Running 'browser-bundle'...
然而,尽管react任务已经完成,但是它应该写入操作系统的文件还不完全存在。我注意到,如果我在browser bundle命令中添加了sleep语句,那么它就会按预期工作,不过这对我来说似乎有点不太正常


如果我希望在文件(来自gulp.dest)被同步写入磁盘之前,react任务不会被视为已完成,我将如何执行该操作?

您需要一个返回语句:

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

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

接受的答案是正确的,但是根据,在gulp的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'));
});
请特别注意使用“运行序列”模块强制任务一个接一个地运行


(如果不运行,
rm-rf build&gulp
将导致
OK:0断言(0ms)
,因为
测试
任务将找不到由
脚本
任务创建的文件,因为它在
脚本
任务完全解决之前启动)

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

我必须在管道上显式地使用
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
,然后再调用
gulpsecond
来查找生成的文件

//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();
}

回到2019年:如果有人带着类似的问题来到这里

至少在吞咽4.*中,吞咽等待承诺解决,但忽略结果。 所以如果使用async Wait模式并返回
gulp.src(“…”)
的结果,您会大吃一惊。任务在继续之前不会等待流完成!可能导致严重错误和时间限制的问题。解决方案是“promisify”
gulp.src

例如:


task(异步函数notWaitingTask()){
//返回流被忽略,因为函数返回承诺不是流
返回gulp.src('file.js')
.管道(大口目的地(“新位置”))
})
task(异步函数waitingTask()){
//返回流是尊重
等待承诺(
gulp.src('file.js')
.管道(大口目的地(“新位置”))
)
})
功能promisifyStream(stream){
返回新承诺(res=>stream.on('end',res));
}

哈,是的,我自己刚想出来。好吧,你还是能拿到分数,谢谢你answering@Rwam开发人员-您是否能够提供一个链接,说明这是在哪里记录的?从我所读到的内容来看,正确的方法如下:@aaaaaa看看这个配方:在gulp任务中使用
return
,可以同步运行任务。否
返回
==异步。