如何停止一系列任务但继续观看Gulp中的文件?

时间:2016-09-23 13:48:05

标签: javascript gulp

我有一个Gulp任务,在将Javascript文件注入HTML页面之前会对其进行删除。如果发现linting错误,我希望不要注入文件。因此,如果第一个任务中出现错误,请取消所有后续任务。

需要注意的是,此任务由gulp.watch运行,我希望手表能够继续监控文件并在解决掉掉错误时注入它们。

这可能在gulp吗?插件是可以接受的。

下面

Gulpfile

var gulp = require('gulp');

var runSequence = require('run-sequence');

//(plugin declarations removed for brevity)

gulp.task('eslint', function() {
  return gulp.src(config.lint)
  .pipe($.cached('eslint'))
  .pipe($.eslint())
  .on('error', $.gutil.log)
  .pipe($.eslint.format());
});

gulp.task('inject:resources', function() {
  return gulp.src(config.src.templates)
  .pipe(
    $.inject(gulp.src(config.dist.scripts + '/all*.js',
    {read: false}),
      {
        ignorePath: config.dist.public,
        addRootSlash: false,
        name: 'scripts'
      }
  ))
  .pipe(gulp.dest(config.dist.public));
});

gulp.task('watch:js', function(callback) {
  runSequence('eslint', 'inject:resources');
});

gulp.task('watch', function() {
  gulp.watch(config.src.scripts, ['watch:js']);
});

1 个答案:

答案 0 :(得分:1)

首先,当您的任何文件产生错误时,您需要使eslint失败。您可以将eslint.failAfterError()放在流的末尾来执行此操作:

gulp.task('eslint', function() {
  return gulp.src(config.lint)
  .pipe($.cached('eslint'))
  .pipe($.eslint())
  .on('error', $.gutil.log)
  .pipe($.eslint.format())
  .pipe($.eslint.failAfterError());
});

eslint任务失败时,inject:resources将不会执行后续runSequence任务。

接下来,您需要将callback任务中的watch:js提供给runSequence,否则gulp将在watch:js完成后不会注意到(并且因为您不能与自身并行运行相同的任务,这将有效防止再次启动watch:js

gulp.task('watch:js', function(callback) {
  runSequence('eslint', 'inject:resources', callback);
});

唯一的缺点是上面会产生一个丑陋的堆栈跟踪,并没有真正提供任何有用的附加信息。如果你想防止你只是“吞下”正在传递回调链的错误,如下所示:

gulp.task('watch:js', function(callback) {
  runSequence('eslint', 'inject:resources', function(err) {
    callback();
  });
});