gulp-jshint:如何使构建失败?

jba*_*ndi 29 jshint gulp

如果JSHint中存在错误,我希望我的Gulp构建失败.

根据gulp-jshint文档,我可以使用"失败的记者".

但是以下不起作用:

gulp.task("lint", function() {
     return gulp.src(JS_SOURCES)
        .pipe(jshint())
        .pipe(jshint.reporter("jshint-stylish"))
        .pipe(jshint.reporter("fail"));
});
Run Code Online (Sandbox Code Playgroud)

即使JSHint中存在错误,上面的任务也始终以退出代码0返回.

我正在使用gulp 3.8.10和gulp-jshint 1.9.0.

gulp-jshint的github问题在这里这里有讨论......但根据这些讨论,我认为上面的代码应该与gulp和gulp-jshint的最新版本一起使用.但是它不......

有没有人想过如何使用gulp-jshint正确地使构建失败?

Elg*_*tel 16

TLDR; 在GulpJS在稳定版本中提供良好解决方案之前,请使用Bahmutov在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);
});
Run Code Online (Sandbox Code Playgroud)

答案很长

这个问题已经在GitHub上发布了:如何使gulp构建失败?#6.特别注意Bahmutov的评论.

他建议的解决方案(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);
});
Run Code Online (Sandbox Code Playgroud)

此问题链接到另一个问题插件不会使构建#10失败.他们在这里基本上说的是,Gulp应该照顾构建失败.这导致了GulpJS上报告的另一个问题:控制失败的构建#113.在轮到他的时候已经转向"完成然后失败"#20.后一个已经修复,可以跟踪Gulp JS版本:改变这个#347.

所以,我们必须等待它被释放......

同时,我们可以使用TLDR中帖子顶部提到的解决方法;

gulpfile.js在任务中scripts-app实现了它.

  • 对于今天的最新gulp,jshint和gulp-jshint,这已不再是正确的解决方案.现在你可以这样做:`gulp.task('check-scripts',function(){return gulp.src(['src/static/stuff/scripts/someImportantScript.js','src/static/stuff/scripts/controllers/*.js','src/static/stuff/scripts/services/*.js','...',]).pipe(jshint()).pipe(jshint.reporter('default')) .pipe(jshint.reporter('fail'));});`Gulp将以代码1退出. (3认同)

Ton*_*ada 14

这个对我有用.我有同样的gulp任务:

return gulp.src(['./src/**/*.js', './docs_src/**/*.js'])
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'))
    .pipe(jshint.reporter('fail'))
Run Code Online (Sandbox Code Playgroud)

这是发生了什么:

$ 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
Run Code Online (Sandbox Code Playgroud)