【问题标题】:gulp error handling for dependent task依赖任务的 gulp 错误处理
【发布时间】:2014-07-26 01:58:24
【问题描述】:

请在下面找到gulpfile.js的内容。

任务uglify 依赖于任务jshint。目前,当我运行gulp 时,这两个任务都会被执行,而不管jshint 任务的结果如何。我不希望在出现“jshint”错误时执行uglify 任务。

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

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']);

请参考以下console output - not desired。虽然出现了jshint 错误,但uglify 任务运行成功。

我还使用上述样板代码创建了一个 GitHub 存储库。 请在@sarbbottam/gulp-workflow 找到相同的内容。

从不受欢迎的工作流程中控制出来

控制台超出预期工作流程

【问题讨论】:

    标签: javascript build gulp


    【解决方案1】:

    对于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'))
    })
    

    对于其他任务,可以在上面添加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)
    })
    

    【讨论】:

    • 谢谢,.pipe(jshint.reporter('fail') 解决了问题,感谢jshint。有没有generic API?我的意思是,gulp-sass 等呢? error callback 是通用的吗?
    • 对我来说是的,一般的做法是在每个你想中断的任务上添加这个callback,以防出错,但我可能是错的。还有一件事,我知道这是一个例子,但是您可以在同一任务中的jshint 之后立即启动uglify,而不是执行两个不同的任务,以减少您的gulp 逻辑。
    • 我想,你建议的两个任务都会很理想,我刚开始使用gulp,所以还在尝试。我已经更新了问题和git repo
    • 是的,这就是要走的路。你应该从你的问题中删除更新的代码,因为它提供了答案,来到这里的人不会理解你为什么会遇到问题。您可以保留预期的图像。
    【解决方案2】:

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

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

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

    【讨论】:

    • 让我免于添加另一个问题
    • 嗨!你介意花那个吗?在这种情况下应该做什么?我处于这种确切的情况,我不想运行下一个任务,但是我仍然希望观察者继续前进,只是想不通!谢谢!
    • done 只是一个由 gulp 传递的 nodejs 样式的回调函数,它允许您指定任务何时完成,或者通过向其传递非空错误参数来指定您的任务失败。如果您将 err 传递给它,那么 gulp 将知道您的任务已失败并且不会运行下一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-11-11
    • 2016-08-12
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多