依赖任务的gulp错误处理

sar*_*tam 8 javascript build gulp

请查看以下内容gulpfile.js.

任务uglify取决于任务jshint.目前,当我运行时gulp,两个任务都会被执行,而不管jshint任务的结果如何.uglify当出现'jshint'错误时,我不希望执行任务.

换句话说,当有任何依赖任务时,如果前面的任务检测到错误,我不希望后续任务被执行.

有可能gulp吗?

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');

gulp.task('jshint', function () {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(jshint('.jshintrc'))
    .pipe(jshint.reporter('jshint-stylish'));
});

gulp.task('uglify', ['jshint'], function() {
  return gulp.src('assets/js/**/*.js')
    .pipe(uglify())
    .pipe(gulp.dest('assets-min/js/'));
});

gulp.task('default', ['jshint', 'uglify']);
Run Code Online (Sandbox Code Playgroud)

请参考以下内容console output - not desired.虽然出现了jshint错误,但uglify任务成功完成.

我还创建了一个GitHub存储库,其中包含上面提到的样板代码.请在@ sarbbottam/gulp-workflow中找到相同的内容.

控制台摆脱了不受欢迎的工作流程 控制台输出 - 不需要

控制台超出预期的工作流程 控制台输出 - 预期

Bal*_*zar 8

因为JSHint,有一个内置的记者为此目的,fail.如果发生错误,它将停止您的gulp过程.

你只需重新定义你的task喜欢:

gulp.task('jshint', function () {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(jshint('.jshintrc'))
    .pipe(jshint.reporter('jshint-stylish'))
    .pipe(jshint.reporter('fail'))
})
Run Code Online (Sandbox Code Playgroud)

对于其他任务,您可以在其error callback上添加并退出该过程以防止后续任务运行.

这是一个例子ngmin(原因uglify很难打破,但它会是相同的):

function handleError (err) {
  console.log(err.toString())
  process.exit(-1)
}

gulp.task('min', function () {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(ngmin())
    .on('error', handleError)
})
Run Code Online (Sandbox Code Playgroud)


Den*_*nov 5

为了补充 Aperçu 的答案,如果您不想 gulp 退出(因为您有观察者正在运行),那么您可以执行以下操作:

gulp.task('min', function(done) {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(ngmin())
    .on('error', done);
});
Run Code Online (Sandbox Code Playgroud)

这将阻止依赖于该任务的下一个任务运行,但您的观察者仍将运行。