35

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

这是我非常简单的 gulpfile

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

4

6 回答 6

12

您需要'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'));
});

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

于 2014-02-11T03:07:30.587 回答
11

@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)
  })
})
于 2014-03-11T00:29:35.170 回答
9

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

它的工作原理是这样的:

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

我一直在circleci上使用它,它很管用!

于 2015-02-04T05:16:05.823 回答
4

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

于 2014-02-24T03:59:25.540 回答
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)
});
于 2016-03-30T15:00:35.530 回答
0
gulp.task('default', function(done) {
  return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});

为我工作

于 2015-11-09T16:24:05.143 回答