Подтвердить что ты не робот

Gulp -jshint: Как сбой сборки?

Я хочу, чтобы моя сборка Gulp завершилась с ошибкой, если в JSHint есть ошибки.

В соответствии с документацией gulp -jshint я могу использовать "репортер сбоев".

Однако следующее не работает:

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

Задача выше всегда возвращается с кодом выхода 0, даже если в JSHint имеются ошибки.

Я использую Gulp 3.8.10 и gulp -jshint 1.9.0.

Здесь обсуждаются проблемы github gulp -jshint здесь и здесь... но по этим обсуждениям я понимаю, что выше код должен работать с последними версиями Gulp и gulp -jshint. Однако это не...

Кто-нибудь понял, как правильно выполнить сборку с помощью gulp -jshint?

4b9b3361

Ответ 1

TL;DR; Пока GulpJS не найдет хорошего решения в стабильном выпуске, используйте обходной путь, предложенный Бахмутов на 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);
});

Длинный ответ

Этот вопрос был опубликован как проблема GitHub: Как сбой gulp build? # 6. Обратите особое внимание на комментарий Бахмутова.

Решение (взлома), которое он предлагает, состоит в том, чтобы добавить свой собственный фильтр и сделать 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);
});

Эта проблема связана с другой проблемой Плагин не выходит из строя # 10. В основном они говорят, что gulp должен заботиться о сбое сборки. Это приводит к еще одной проблеме, о которой сообщалось в GulpJS: Управление сбоями сборки # 113. Который, в свою очередь, перешел на "закончить, а затем провалиться" # 20. Последний был исправлен, и релиз gulp JS можно отслеживать по следующему адресу: изменение этого # 347.

Итак, нам придется подождать, пока он будет выпущен...

В то же время мы можем использовать обходное решение, указанное в верхней части моего сообщения в TL;DR;

Я выполнил его gulpfile.js в задаче scripts-app.

Ответ 2

Это работает для меня. У меня та же задача 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 [[email protected]: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 [[email protected]: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 [[email protected]:o +1] ~/work/solo/fsstatic2 (master)  
$ echo $?
1