Gulp流在文件写入之前完成

Gulp stream finishes before file is written

本文关键字:文件 Gulp      更新时间:2023-09-26

我们的构建过程通过browserify运行app.js来处理require()语句,然后将结果与其他一些脚本连接起来创建scripts.js。这是在两个独立的任务中完成的。

由于某种原因,第一个任务在写入文件之前结束,导致app.js被排除在构建之外。这个任务是从这个Gulp食谱复制过来的,只做了最小的修改。

下面是我们的gulpfile的相关部分:

gulp.task('scripts', ['angular', 'views-js'], function () {
  var bundledStream = through();
  bundledStream
      .pipe(source('app.js'))
      .pipe(buffer())
      .pipe(debug())
      .pipe(uglify())
      .on('error', gutil.log)
      .pipe(sourcemaps.write(paths.target))
      .pipe(gulp.dest(paths.target));
  globby([paths.scripts], function(err, entries) {
    if (err) {
      bundledStream.emit('error', err);
      return;
    }
    var b = browserify({
      entries: entries,
      debug: true,
    });
    b.bundle().pipe(bundledStream);
  });
  return bundledStream;
});
// Take all the scripts in the target directory and concatenate them to scripts.js.
gulp.task('scripts-all', ['scripts'], function () {
  return gulp.src([path.join(paths.target, '*.js'), '!'+path.join(paths.target, 'scripts.js')])
  .pipe(debug())
  .pipe(concat('scripts.js'))
  .pipe(header(banner, { pkg : pkg } ))
  .pipe(gulp.dest(paths.target))
  .pipe(livereload(reloadServer));
});

这就是我们构建时发生的事情。注意,.debug()管道在任务完成后执行。这将导致文件在scripts-all中错过.src()扫描。

[16:57:46] Starting 'scripts'...
[16:57:46] Finished 'views' after 835 ms
[16:57:47] Finished 'scripts' after 749 ms
[16:57:47] Starting 'scripts-all'...
[16:57:47] gulp-debug: (2015-09-28 13:57:47 UTC)
File
cwd:      ~/projects/ourProject
base:     ~/projects/ourProject
path:     ~/projects/ourProject/app.js
contents: (function e(t,n,r){function s(o,u){if(!n...
[16:57:48] gulp-debug: end event fired (2015-09-28 13:57:48 UTC)

我们做错了什么?

我不知道globby,但文档说它返回一个承诺。我的猜测是,当它完成并从您传入的函数返回时,承诺将被解决。您可能需要返回承诺以阻止任务完成。

如果这不能解决这个问题,我会尝试创建自己的承诺,并在bundledStream'end'事件处理程序中解决它,因为它看起来像你想在bundledStream完成其工作时解决任务。

var Q = require('q');
gulp.task('scripts', ['angular', 'views-js'], function () {
  var bundledStream = through();
  var deferred = Q.defer();
  bundledStream
      .pipe(source('app.js'))
      .pipe(buffer())
      .pipe(debug())
      .pipe(uglify())
      .on('error', gutil.log)
      .pipe(sourcemaps.write(paths.target))
      .pipe(gulp.dest(paths.target))
      .on('end', function()
        {
        deferred.resolve();
        });
....
  return deferred.promise;

我没有测试你的特定任务,但这是我昨天处理类似问题的方法