我在我的小项目中使用Gulp来运行测试和lint我的代码。当任何这些任务失败时,Gulp总是以返回码0退出。如果我手动运行jshint,它会以非零代码退出。
Here's my very simple gulpfile
我是否需要以某种方式明确告诉Gulp返回有意义的值?这是Gulp的错吗,还是gulp-jshint和gulp-jasmine插件应该受到责备?
答案 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); } )
});
为我工作