【问题标题】:Gulp returns 0 when tasks fail任务失败时 Gulp 返回 0
【发布时间】:2014-03-08 10:58:54
【问题描述】:

我在我的小项目中使用 Gulp 来运行测试和 lint 我的代码。当这些任务中的任何一个失败时,Gulp 总是以返回代码 0 退出。如果我手动运行 jshint,它应该以非零代码退出。

Here's my very simple gulpfile.

我是否需要以某种方式明确告诉 Gulp 返回一个有意义的值?这是 Gulp 的错,还是 gulp-jshint 和 gulp-jasmine 插件的错?

【问题讨论】:

    标签: javascript gulp jshint


    【解决方案1】:

    您需要'return gulp.src(...' 以便任务等待返回的流。

    编辑

    Gulp 任务本质上是异步的。在 'gulp.src(...).pipe(...);' 时,实际任务尚未执行。在您的示例中,gulp 任务在执行实际任务之前将其结果标记为成功。

    有一些方法可以让 gulp 等待你的实际任务。使用回调或返回流或承诺。

    https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support

    最简单的方法就是返回 'gulp.src(...).pipe(...)' 的流。如果 gulp 任务得到一个流,它会监听 'end' 事件和 'error' 事件。它们对应于返回码 0 和 1。因此,“lint”任务的完整示例如下:

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

    一个好处是,现在您可以衡量花费在您的任务上的实际时间。

    【讨论】:

    【解决方案2】:

    gulp-jshint 一直在努力解决如何在 jshint 失败时构建失败。一方面,我们可以使 jshint 内部的构建崩溃,但你永远无法找到记者。另一方面,要求报告者构建失败并不是默认报告者的一部分。我通常会联系我自己的记录失败的记者,.on('end', function () {process.exit(1)。这是相当蛮力,但它就像一个魅力。见https://github.com/wearefractal/gulp-jshint/issues/10

    【讨论】:

    • 您好 robrich,感谢您的参考。虽然我知道可能需要讨论如何失败以及如何报告,但我认为返回非零值只是常见的 Unix 礼貌,因此它应该是默认行为。我会试试你的解决方法。
    【解决方案3】:

    @robrich 是对的,您必须自己跟踪退出代码,但不需要强制方法。 process 全局是一个 EventEmitter,您可以将退出函数绑定到它。

    var exitCode = 0
    
    gulp.task('test', function (done) {
      return require('child_process')
        .spawn('npm', ['test'], {stdio: 'pipe'})
        .on('close', function (code, signal) {
          if (code) exitCode = code
          done()
        })
    })
    
    gulp.on('err', function (err) {
      process.emit('exit') // or throw err
    })
    
    process.on('exit', function () {
      process.nextTick(function () {
        process.exit(exitCode)
      })
    })
    

    【讨论】:

    • 为什么要在 gulp 错误处理程序中发出退出事件而不是直接调用process.exit
    • Tiddo,上面的代码不会发出退出事件,而是监听一个。每当遇到退出事件时,它都会排队 process.exit(exitCode) 以在下一个滴答声中运行。
    • 太搞笑了
    【解决方案4】:

    this commit 中引入了一个修复程序。

    它的工作原理是这样的:

    gulp.src("src/**/*.js")
      .pipe(jshint())
      .pipe(jshint.reporter("default"))
      .pipe(jshint.reporter("fail"));
    

    我一直在 circleci 上使用它,效果很好!

    【讨论】:

    • 谢谢,这正是我期待的最终结果。
    • 你知道 Jasmine 是否有类似的修复方法?
    【解决方案5】:
    gulp.task('default', function(done) {
      return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
    });
    

    为我工作

    【讨论】:

      【解决方案6】:

      与上面的 Andy Piper 回答类似,我发现此模块 stream-combiner2 在运行一系列任务时很有用,以确保在某处出现错误时发出退出代码。可以这样用

      var combiner = require('stream-combiner2');
      
      var tasks = combiner.obj([
          gulp.src(files),
          task1(options),
          task2(options),
          gulp.dest('path/to/dest')
      ]);
      
      tasks.on('error', function () {
          process.exit(1)
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-25
        • 2015-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        相关资源
        最近更新 更多