web-dev-qa-db-fra.com

gulp-jshint: Comment échouer la construction?

Je veux que ma version Gulp échoue, s'il y a des erreurs dans JSHint.

Selon le documentation de gulp-jshint je peux utiliser le "reporter d'échec".

Cependant, ce qui suit ne fonctionne pas:

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

La tâche ci-dessus renvoie toujours le code de sortie 0, même en cas d'erreurs dans JSHint.

J'utilise gulp 3.8.10 et gulp-jshint 1.9.0.

Il y a des discussions dans les problèmes github de gulp-jshint ici et ici ... mais d'après ces discussions, je suppose que le code ci-dessus devrait fonctionner avec les dernières versions de gulp et gulp -jshint. Mais ce n'est pas le cas ...

Quelqu'un a-t-il compris comment échouer correctement la construction avec gulp-jshint?

28
jbandi

TLDR; Jusqu'à ce que GulpJS vienne avec une bonne solution dans une version stable, utilisez la solution de contournement suggérée par Bahmutov sur GitHub .

Il crée une solution de contournement, en utilisant son propre filtre:

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

Réponse longue

Cette question a été publiée comme un problème sur GitHub: Comment échouer à la compilation de gulp? # 6 . Portez une attention particulière à commentaire de Bahmutov .

La solution (hack) qu'il propose est d'ajouter son propre filtre et de faire une process.exit(1); lorsqu'il y a des erreurs d'indication, qui ressemble à ceci:

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

Ce problème est lié à un autre problème le plugin n'échoue pas au build # 1 . Ce qu'ils disent ici essentiellement, c'est que Gulp devrait s'occuper de l'échec de la construction. Cela entraîne un autre problème qui a été signalé sur GulpJS: Contrôle des builds défaillants # 11 . Ce qui à son tour a été déplacé vers "terminer puis échouer" # 2 . Ce dernier a été corrigé et la version Gulp JS peut être suivie sur: en changeant ce # 347 .

Il faudra donc attendre sa sortie ...

En attendant, nous pouvons utiliser la solution de contournement mentionnée en haut de mon message dans le TLDR;

Je l'ai implémenté mon gulpfile.js Dans la tâche scripts-app .

16
Elger van Boxtel

Ça marche pour moi. J'ai la même tâche de gorgée:

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

et voici ce qui se passe:

$ 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