Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gulp error handling for dependent task

Please find the content of the gulpfile.js as below.

The task uglify depends on the task jshint. Currently when I run gulp, both the tasks get executed, irrespective of the outcome of the jshint task. I don't want the uglify task to get executed when there are 'jshint' error(s).

In other words, when ever there are dependent tasks, I don't want the subsequent tasks to get executed, if there are error detected by the preceding task.

Is it possible in gulp?

var gulp = require('gulp');
var jshint = require('gulp-jshint');
var uglify = require('gulp-uglify');

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

gulp.task('uglify', ['jshint'], function() {
  return gulp.src('assets/js/**/*.js')
    .pipe(uglify())
    .pipe(gulp.dest('assets-min/js/'));
});

gulp.task('default', ['jshint', 'uglify']);

Please refer the below console output - not desired. Though there had been jshint error, the uglify task ran successfully.

I have also created a GitHub repository with the boilerplate code for the above mentioned. Please find the same at @sarbbottam/gulp-workflow.

Console out of the undesired workflow console output - not desired

Console out of the expected workflow console output - expected

like image 972
Sarbbottam Avatar asked Jul 26 '14 01:07

Sarbbottam


2 Answers

For JSHint, there is a built-in reporter for this purpose, fail. If an error occurs, it will stop your gulp process.

You just have to redefine your task like :

gulp.task('jshint', function () {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(jshint('.jshintrc'))
    .pipe(jshint.reporter('jshint-stylish'))
    .pipe(jshint.reporter('fail'))
})

With other tasks, you can add an error callback on it and exit the process to prevent subsequent tasks to run.

Here is an example with ngmin (cause uglify is hard to break, but it will be the same) :

function handleError (err) {
  console.log(err.toString())
  process.exit(-1)
}

gulp.task('min', function () {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(ngmin())
    .on('error', handleError)
})
like image 86
Preview Avatar answered Oct 13 '22 05:10

Preview


To complement Aperçu's answer, if you don't want gulp to just exit (because you have watcher running) then you can do the following:

gulp.task('min', function(done) {
  return gulp.src(['assets/js/**/*.js'])
    .pipe(ngmin())
    .on('error', done);
});

This will prevent the next task that depends on this one to run but your watchers will still be running.

like image 31
Denis Pshenov Avatar answered Oct 13 '22 06:10

Denis Pshenov