Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gulp returns 0 when tasks fail

I'm using Gulp in my small project in order to run tests and lint my code. When any of those tasks fail, Gulp always exits with return code 0. If I run jshint by hand, it exits with non-zero code as it should.

Here's my very simple gulpfile.

Do I need to somehow explicitly tell Gulp to return a meaningful value? Is this Gulp's fault, or maybe the gulp-jshint and gulp-jasmine plugins are to blame?

like image 241
Roberto Bonvallet Avatar asked Feb 10 '14 21:02

Roberto Bonvallet


2 Answers

You need to 'return gulp.src(...' so that the task waits for the returned stream.

EDIT

Gulp tasks are asynchronous by nature. The actual task is not executed yet at the time of 'gulp.src(...).pipe(...);'. In your example, the gulp tasks mark their results as success before the actual tasks are executed.

There are some ways to make gulp to wait for your actual task. Use a callback or return a stream or promise.

https://github.com/gulpjs/gulp/blob/master/docs/API.md#async-task-support

The easiest way is just returning the stream of 'gulp.src(...).pipe(...)'. If gulp task gets a stream, it will listen to 'end' event and 'error' event. They corresponds to return code 0 and 1. So, a full example for your 'lint' task would be:

gulp.task('lint', function () {     return gulp.src('./*.js')                .pipe(jshint('jshintrc.json'))                .pipe(jshint.reporter('jshint-stylish')); }); 

A bonus is that now you can measure the actual time spent on your tasks.

like image 78
Shuhei Kagawa Avatar answered Sep 23 '22 16:09

Shuhei Kagawa


@robrich is right, you have to keep track of exit codes yourself, but there's no need for a forceful approach. The process global is an EventEmitter which you can bind your exit function to.

var exitCode = 0  gulp.task('test', function (done) {   return require('child_process')     .spawn('npm', ['test'], {stdio: 'pipe'})     .on('close', function (code, signal) {       if (code) exitCode = code       done()     }) })  gulp.on('err', function (err) {   process.emit('exit') // or throw err })  process.on('exit', function () {   process.nextTick(function () {     process.exit(exitCode)   }) }) 
like image 30
Alec Wenzowski Avatar answered Sep 21 '22 16:09

Alec Wenzowski