Javascript 在写入文件之前,吞流结束

Javascript 在写入文件之前,吞流结束,javascript,gulp,browserify,glob,Javascript,Gulp,Browserify,Glob,我们的构建过程通过browserify运行app.js来处理require语句,然后将结果与一些其他脚本连接起来以创建scripts.js。这是在两个独立的任务中完成的 出于某种原因,第一个任务在写入文件之前结束,导致app.js被排除在构建之外。该任务是从复制的,修改很少 以下是我们gulpfile的相关部分: gulp.task('scripts', ['angular', 'views-js'], function () { var bundledStream = through();

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

出于某种原因,第一个任务在写入文件之前结束,导致app.js被排除在构建之外。该任务是从复制的,修改很少

以下是我们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管道是在任务完成后执行的。这会导致文件在所有脚本中错过.src扫描

我们做错了什么?

我不知道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;

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

谢谢您的回答!Globby的承诺解决得太早了,因为工具链的其余部分仍然没有执行。实际上,我们最终通过在流的末尾调用gulp回调函数来修复它,这应该会得到与您的建议几乎相同的结果。很高兴听到您修复了它。我还没有使用回调,但我会记住你的解决方案。
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;