我在我的小项目中使用 Gulp 来运行测试并检查我的代码。当这些任务中的任何一个失败时,Gulp 总是以返回码 0 退出。如果我手动运行 jshint,它应该以非零代码退出。
我是否需要以某种方式明确告诉 Gulp 返回一个有意义的值?这是 Gulp 的错,还是 gulp-jshint 和 gulp-jasmine 插件应该受到责备?
我在我的小项目中使用 Gulp 来运行测试并检查我的代码。当这些任务中的任何一个失败时,Gulp 总是以返回码 0 退出。如果我手动运行 jshint,它应该以非零代码退出。
我是否需要以某种方式明确告诉 Gulp 返回一个有意义的值?这是 Gulp 的错,还是 gulp-jshint 和 gulp-jasmine 插件应该受到责备?
您需要'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'));
});
一个好处是,现在您可以衡量花费在您的任务上的实际时间。
@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)
})
})
此提交中引入了一个修复程序。
它的工作原理是这样的:
gulp.src("src/**/*.js")
.pipe(jshint())
.pipe(jshint.reporter("default"))
.pipe(jshint.reporter("fail"));
我一直在circleci上使用它,它很管用!
gulp-jshint 一直在努力解决如何使 jshint 的构建失败。一方面,我们可以使 jshint 内部的构建崩溃,但你永远无法找到记者。另一方面,要求报告者构建失败并不是默认报告者的一部分。我通常会联系我自己的记者来跟踪失败,并且.on('end', function () {
会process.exit(1)
。这是相当蛮力,但它就像一个魅力。见https://github.com/wearefractal/gulp-jshint/issues/10
与上面的 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)
});
gulp.task('default', function(done) {
return gulp.src( ... ).pipe(jasmine( ... )).on('error', function(err) { done(err); } )
});
为我工作