Javascript 任务失败时,Gulp返回0

Javascript 任务失败时,Gulp返回0,javascript,gulp,jshint,Javascript,Gulp,Jshint,我在我的小项目中使用Gulp来运行测试和lint我的代码。当这些任务中的任何一个失败时,Gulp总是以返回代码0退出。如果我手动运行jshint,它将以非零代码退出 我是否需要明确地告诉Gulp返回一个有意义的值?这是Gulp的错,还是Gulp jshint和Gulp jasmine插件的错?您需要“return Gulp.src(…”,以便任务等待返回的流 编辑 Gulp任务本质上是异步的。在“Gulp.src(…).pipe(…);”时,实际任务尚未执行。在您的示例中,Gulp任务在执行实

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


我是否需要明确地告诉Gulp返回一个有意义的值?这是Gulp的错,还是Gulp jshint和Gulp jasmine插件的错?

您需要“return Gulp.src(…”,以便任务等待返回的流

编辑

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

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

最简单的方法就是返回“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'));
});

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

gulp jshint一直在努力解决如何使基于jshint的构建失败。一方面,我们可以在jshint内部使构建崩溃,但您永远无法访问报告程序。另一方面,要求报告程序使构建失败不是默认报告程序的一部分.我通常会连接我自己的记录失败的reporter,并且
。在('end',函数(){
处理。退出(1)
。这是一种蛮力,但效果很好。请看

@robrich是对的,您必须自己跟踪退出代码,但不需要强制方法。
进程
全局是一个可以绑定退出函数的
事件发射器

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.src("src/**/*.js")
  .pipe(jshint())
  .pipe(jshint.reporter("default"))
  .pipe(jshint.reporter("fail"));
我一直在circleci上使用它,效果不错

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

适用于我

与上面的Andy Piper答案类似,我发现这个模块在运行一系列任务时非常有用,以确保在某个地方出现错误时发出退出代码。可以使用类似的方法

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

嗨,Shuhei,它也不起作用。谢谢链接,我会更深入地了解它。嗨,Roberto,你可能需要让你的任务失败。嗨,robrich,谢谢你的参考。虽然我知道可能需要讨论如何失败以及如何报告,但我认为返回非零只是Unix的常见礼貌,所以不应该这样默认行为。我将尝试您的解决方法。为什么您要在gulp错误处理程序中发出退出事件,而不是直接调用
process.exit
?Tiddo,上面的代码不会发出退出事件,而是侦听退出事件。每当遇到退出事件时,它都会将进程排队。exit(exitCode)这真是太搞笑了,汉克斯,这就是我期望最终会发生的事。你知道茉莉花是否也有类似的解决办法吗?