任务失败时Gulp返回0

时间:2014-02-10 21:46:44

标签: javascript gulp jshint

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

Here's my very simple gulpfile

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

6 个答案:

答案 0 :(得分: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'));
});

奖励是,现在您可以衡量在任务上花费的实际时间。

答案 1 :(得分:10)

@robrich是对的,你必须自己跟踪退出代码,但不需要强有力的方法。 process全局是EventEmitter,您可以将退出函数绑定到。{/ p>

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)
  })
})

答案 2 :(得分:9)

this commit已经引入了修补程序。

它的工作原理如下:

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

我一直在circleci上使用它,它有效!

答案 3 :(得分:4)

gulp-jshint一直在努力解决如何在jshint失败时失败的问题。一方面,我们可以在jshint中崩溃构建,但是你永远不会找到记者。另一方面,要求记者失败的构建不是默认记者的一部分。我通常会联系我自己的记者跟踪失败,.on('end', function () {process.exit(1)。这是一种非常强大的力量,但它就像一个魅力。见https://github.com/wearefractal/gulp-jshint/issues/10

答案 4 :(得分:2)

与上面的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)
});

答案 5 :(得分:0)

gulp.task('default', function(done) {
  return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});

为我工作