任务失败时Gulp返回0

Rob*_*let 34 javascript jshint gulp

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

这是我非常简单的gulpfile.

我是否需要以某种方式明确告诉Gulp返回有意义的值?这是Gulp的错吗,还是gulp-jshint和gulp-jasmine插件应该受到责备?

Shu*_*awa 12

你需要'返回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'));
});
Run Code Online (Sandbox Code Playgroud)

现在您可以衡量实际花在任务上的时间.


Ale*_*ski 10

@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)
  })
})
Run Code Online (Sandbox Code Playgroud)

  • 这太搞笑了 (3认同)
  • 为什么在gulp错误处理程序中发出exit事件而不是直接调用`process.exit`? (2认同)

Rim*_*ian 9

此提交中引入了一个修复程序.

它的工作原理如下:

gulp.src("src/**/*.js")
  .pipe(jshint())
  .pipe(jshint.reporter("default"))
  .pipe(jshint.reporter("fail"));
Run Code Online (Sandbox Code Playgroud)

我一直在circleci上使用它,这是一种享受!