gulp-jshint:如何使构建失败?
gulp-jshint: How to fail the build?
如果 JSHint 中存在错误,我希望我的 Gulp 构建失败。
根据documentation of gulp-jshint我可以用"fail reporter".
但是以下方法不起作用:
gulp.task("lint", function() {
return gulp.src(JS_SOURCES)
.pipe(jshint())
.pipe(jshint.reporter("jshint-stylish"))
.pipe(jshint.reporter("fail"));
});
上面的任务总是 returns 退出代码为 0,即使 JSHint 中出现错误也是如此。
我正在使用 gulp 3.8.10 和 gulp-jshint 1.9.0。
在 gulp-jshint here and here 的 github 问题中有讨论......但根据这些讨论,我收集到上面的代码应该适用于最新版本的 gulp 和 gulp-jshint。然而它并没有...
有没有人想出如何使用 gulp-jshint 正确地使构建失败?
TLDR;
在 GulpJS 在稳定版本中提供一个好的解决方案之前,请使用 Bahmutov on GitHub 所建议的解决方法。
他使用自己的过滤器创建了一个解决方法:
var map = require('map-stream');
var exitOnJshintError = map(function (file, cb) {
if (!file.jshint.success) {
console.error('jshint failed');
process.exit(1);
}
});
gulp.task('lint', function() {
gulp.src('example.js')
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(exitOnJshintError);
});
长答案
此问题已被 post编辑为 GitHub 上的一个问题: How to fail gulp build? #6 . Pay special attention to Bahmutov's comment。
他提出的解决方案 (hack) 是添加自己的过滤器并在出现提示错误时执行 process.exit(1);
,如下所示:
var map = require('map-stream');
var exitOnJshintError = map(function (file, cb) {
if (!file.jshint.success) {
console.error('jshint failed');
process.exit(1);
}
});
gulp.task('lint', function() {
gulp.src('example.js')
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(exitOnJshintError);
});
这个问题链接到另一个问题 Plugin doesn't fail build #10。
他们在这里基本上说的是 Gulp 应该处理构建失败的问题。
这导致了 GulpJS 上报告的另一个问题:Controlling failing builds #113. Which on his turn has been move to "finish then fail" #20。
后一个已修复,可以跟踪 Gulp JS 版本:changing this #347.
所以,我们将不得不等待它被释放...
与此同时,我们可以使用 TLDR 中 post 顶部提到的解决方法;
我已经实现了我的 gulpfile.js
in task scripts-app
。
对我有用。我有相同的 gulp 任务:
return gulp.src(['./src/**/*.js', './docs_src/**/*.js'])
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(jshint.reporter('fail'))
下面是发生的事情:
$ gulp --version
[11:03:41] CLI version 3.9.0
[11:03:41] Local version 3.9.0
[14559:3392 - 0:2151] 11:03:41 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ cat package.json
{
"name": "fsstatic2",
"version": "0.0.0",
"description": "fsstatic",
"author": "FreedomSponsors",
"devDependencies": {
"gulp": "~3.9.0",
"gulp-concat": "~2.5.2",
"gulp-linker": "~0.1.7",
"gulp-webserver": "~0.9.1",
"yargs": "~3.12.0",
"gulp-sass": "~2.0.1",
"gulp-ng-templates": "0.0.6",
"gulp-ngtemplate": "~0.2.5",
"gulp-htmlmin": "~1.1.3",
"merge-stream": "~0.1.7",
"gulp-copy": "0.0.2",
"gulp-jshint": "~1.11.0",
"jshint-stylish": "~2.0.1"
}
}
[14559:3392 - 0:2152] 11:04:01 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ gulp jshintall
[11:04:11] Using gulpfile ~/work/solo/fsstatic2/gulpfile.js
[11:04:11] Starting 'jshintall'...
/home/tony/work/solo/fsstatic2/src/components/todo_example/todo.js
line 26 col 23 Missing semicolon.
⚠ 1 warning
[11:04:11] 'jshintall' errored after 467 ms
[11:04:11] Error in plugin 'gulp-jshint'
Message:
JSHint failed for: /home/tony/work/solo/fsstatic2/src/components/todo_example/todo.js
[14559:3392 - 0:2153] 11:04:11 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ echo $?
1
如果 JSHint 中存在错误,我希望我的 Gulp 构建失败。
根据documentation of gulp-jshint我可以用"fail reporter".
但是以下方法不起作用:
gulp.task("lint", function() {
return gulp.src(JS_SOURCES)
.pipe(jshint())
.pipe(jshint.reporter("jshint-stylish"))
.pipe(jshint.reporter("fail"));
});
上面的任务总是 returns 退出代码为 0,即使 JSHint 中出现错误也是如此。
我正在使用 gulp 3.8.10 和 gulp-jshint 1.9.0。
在 gulp-jshint here and here 的 github 问题中有讨论......但根据这些讨论,我收集到上面的代码应该适用于最新版本的 gulp 和 gulp-jshint。然而它并没有...
有没有人想出如何使用 gulp-jshint 正确地使构建失败?
TLDR; 在 GulpJS 在稳定版本中提供一个好的解决方案之前,请使用 Bahmutov on GitHub 所建议的解决方法。
他使用自己的过滤器创建了一个解决方法:
var map = require('map-stream');
var exitOnJshintError = map(function (file, cb) {
if (!file.jshint.success) {
console.error('jshint failed');
process.exit(1);
}
});
gulp.task('lint', function() {
gulp.src('example.js')
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(exitOnJshintError);
});
长答案
此问题已被 post编辑为 GitHub 上的一个问题: How to fail gulp build? #6 . Pay special attention to Bahmutov's comment。
他提出的解决方案 (hack) 是添加自己的过滤器并在出现提示错误时执行 process.exit(1);
,如下所示:
var map = require('map-stream');
var exitOnJshintError = map(function (file, cb) {
if (!file.jshint.success) {
console.error('jshint failed');
process.exit(1);
}
});
gulp.task('lint', function() {
gulp.src('example.js')
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(exitOnJshintError);
});
这个问题链接到另一个问题 Plugin doesn't fail build #10。 他们在这里基本上说的是 Gulp 应该处理构建失败的问题。 这导致了 GulpJS 上报告的另一个问题:Controlling failing builds #113. Which on his turn has been move to "finish then fail" #20。 后一个已修复,可以跟踪 Gulp JS 版本:changing this #347.
所以,我们将不得不等待它被释放...
与此同时,我们可以使用 TLDR 中 post 顶部提到的解决方法;
我已经实现了我的 gulpfile.js
in task scripts-app
。
对我有用。我有相同的 gulp 任务:
return gulp.src(['./src/**/*.js', './docs_src/**/*.js'])
.pipe(jshint())
.pipe(jshint.reporter('jshint-stylish'))
.pipe(jshint.reporter('fail'))
下面是发生的事情:
$ gulp --version
[11:03:41] CLI version 3.9.0
[11:03:41] Local version 3.9.0
[14559:3392 - 0:2151] 11:03:41 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ cat package.json
{
"name": "fsstatic2",
"version": "0.0.0",
"description": "fsstatic",
"author": "FreedomSponsors",
"devDependencies": {
"gulp": "~3.9.0",
"gulp-concat": "~2.5.2",
"gulp-linker": "~0.1.7",
"gulp-webserver": "~0.9.1",
"yargs": "~3.12.0",
"gulp-sass": "~2.0.1",
"gulp-ng-templates": "0.0.6",
"gulp-ngtemplate": "~0.2.5",
"gulp-htmlmin": "~1.1.3",
"merge-stream": "~0.1.7",
"gulp-copy": "0.0.2",
"gulp-jshint": "~1.11.0",
"jshint-stylish": "~2.0.1"
}
}
[14559:3392 - 0:2152] 11:04:01 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ gulp jshintall
[11:04:11] Using gulpfile ~/work/solo/fsstatic2/gulpfile.js
[11:04:11] Starting 'jshintall'...
/home/tony/work/solo/fsstatic2/src/components/todo_example/todo.js
line 26 col 23 Missing semicolon.
⚠ 1 warning
[11:04:11] 'jshintall' errored after 467 ms
[11:04:11] Error in plugin 'gulp-jshint'
Message:
JSHint failed for: /home/tony/work/solo/fsstatic2/src/components/todo_example/todo.js
[14559:3392 - 0:2153] 11:04:11 [tony@tony-lin:o +1] ~/work/solo/fsstatic2 (master)
$ echo $?
1