web-dev-qa-db-ja.com

gulp-jshint:ビルドを失敗させる方法は?

JSHintにエラーがある場合、Gulpビルドが失敗するようにします。

gulp-jshintのドキュメント に従って、「fail reporter」を使用できます。

ただし、以下は機能しません。

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

上記のタスクは、JSHintにエラーがある場合でも、常に終了コード0で戻ります。

Gulp 3.8.10とgulp-jshint 1.9.0を使用しています。

Gulp-jshint here および here のgithubの問題に関する議論がありますが、それらの議論によれば、上記のコードはgulpおよびgulpの最新バージョンで動作するはずです。 -jshint。しかし、そうではありません...

誰かがgulp-jshintでビルドを正しく失敗させる方法を見つけましたか?

28
jbandi

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);
});
_

長答

この質問は、GitHubの問題として投稿されています: gulpビルドの失敗方法#6Bahmutovのコメント に特に注意してください。

彼が提案する解決策(ハック)は、独自のフィルターを追加し、次のようなヒントエラーが発生したときに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で報告されている別の問題が発生します: Controlling failing builds#11 。彼の順番で "finish then fail"#2 に移動しました。後者は修正されており、Gulp JSリリースは次の場所で追跡できます: changeing this#347

そのため、リリースされるのを待つ必要があります...

それまでは、TLDRの投稿の冒頭で述べた回避策を使用できます。

_gulpfile.js_をタスク_scripts-app_ に実装しました。

16

わたしにはできる。私は同じ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
14
Tony Lâmpada