2015-01-09 8 views
28

Ich möchte mein Gulp Build fehlschlagen, wenn es in JSHint Fehler gibt.gulp-jshint: Wie scheitert der Build?

Nach der documentation of gulp-jshint kann ich den "Fail-Reporter" verwenden.

jedoch folgendes nicht funktioniert:

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

Die Aufgabe oben kehrt immer mit Exit-Code 0, auch wenn es Fehler in JSHint sind.

Ich benutze Schluck 3.8.10 und Schluck-jshint 1.9.0.

Es gibt Diskussionen in den github Ausgaben von gulp-jshint here und here ... aber nach diesen Diskussionen, die ich oben Code sammeln sollte mit den neuesten Versionen von Schluck und Schluck-Jshint arbeiten. Allerdings ist es nicht ...

Hat jemand herausgefunden, wie man den Build mit gulp-jshint richtig scheitern?

+0

Werke für mich mit [email protected] und [email protected] Welche Versionen verwendest du? – Ben

+0

@Ben Ich benutze auch Schluck 3.8.10 und Schluck-Jshint 1.9.0 (wie in der Frage angegeben).Wenn ich das 'return' weglasse, funktioniert es auch, aber mit der Rückkehr ist der Exit-Code immer 0. Vielleicht sollte ich auf ein Fehlerereignis hören, wenn ich den Stream zurückgebe? – jbandi

+0

Das könntest du sicherlich tun, aber das solltest du nicht tun müssen. :(Mein Code sieht genauso aus wie deins, außer dass ich den 'default' Reporter anstelle des' jshint-stylish' Reporters benutze. – Ben

Antwort

16

TLDR; Bis GulpJS mit einer guten Lösung in einer stabilen Version geliefert wird, verwenden Sie die Problemumgehung wie von Bahmutov on GitHub vorgeschlagen.

Er schafft eine Abhilfe, seinen eigenen Filter mit:

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

Lange Antwort

Diese Frage als Thema auf GitHub veröffentlicht wurde: How to fail gulp build? #6. Achten Sie besonders auf Bahmutov's comment.

Die Lösung (Hack) schlägt er ist seinen eigenen Filter hinzuzufügen und macht ein process.exit(1); wenn es Hinting Fehler, die wie folgt aussieht:

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

Dieses Problem Link zu einer neuen Ausgabe Plugin doesn't fail build #10. Was sie hier im Grunde sagen, ist, dass Gulp sich um den Baufehler kümmern sollte. Dies führt zu einem anderen Problem, das auf GulpJS: Controlling failing builds #113 berichtet wurde. Wer an der Reihe ist, wurde zu "finish then fail" #20 bewegt. Letzteres wurde behoben und die Gulp JS Version kann verfolgt werden: changing this #347.

Also, wir müssen warten, bis es freigegeben werden ...

In der Zwischenzeit können wir die Problemumgehung wie erwähnt an der Spitze meiner Post im TLDR verwenden;

Ich habe es implementiert meine gulpfile.js in task scripts-app.

+3

Dies ist nicht mehr die richtige Lösung mit dem letzten Schluck, JShint und Schluck-JShint . heute Jetzt können Sie einfach tun: 'gulp.task ('Check-Skripte', function() { return gulp.src ([ 'src/static/stuff/scripts/someImportantScript.js', ‚src /static/stuff/scripts/controllers/*.js ', ' src/static/stuffs/scripts/services/*. js ', ' ... ', ]) .pipe (jshint()) .pipe (jshint.reporter ('default')) .pipe (jshint.reporter ('fail')); }); ' Gulp wird mit Code 1 beendet. –

+1

Bei Verwendung von run-sequence ist dies immer noch die richtige Antwort. –

11

Es funktioniert für mich. Ich habe die gleiche Schluck Aufgabe:

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

und hier ist, was passiert:

$ 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 
+1

Ab gulp-jshint 2.0.0 ist dies die richtige Antwort. –

Verwandte Themen