Javascript 任务失败时,Gulp返回0
我在我的小项目中使用Gulp来运行测试和lint我的代码。当这些任务中的任何一个失败时,Gulp总是以返回代码0退出。如果我手动运行jshint,它将以非零代码退出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返回一个有意义的值?这是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)这真是太搞笑了,汉克斯,这就是我期望最终会发生的事。你知道茉莉花是否也有类似的解决办法吗?