gulpjs / gulp

A toolkit to automate & enhance your workflow

Home Page:https://gulpjs.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Monkey patching `pipe` method from gulp.src

floatdrop opened this issue · comments

In continue from this issue and summed up thoughts about error handling in gulp here is possible solution. Monkey patch pipe method from gulp.src in such a way, that it will monkey patch other streams, when you call pipe on them. This will allow fix pipe behaviour, that unpipes destanation stream on error.

Here is proposed options to gulp.src:

unpipeOnError [Boolean]
Don't remove ondata listener in destination stream on error. This option inherits on all streams in pipeline.

logOnError: [Boolean, String]
Little helper, that cleans up copy-pasted on('error', gutil.log) code. It will log errors that prefixed by passed string.

Example of usage:

gulp.src('coffee/**/*.coffee', { unpipeOnError: false, logOnError: true })
  .pipe(gulpPrefixer('// Copyright 2014 (C) Aswesome company'))
  .pipe(coffee())
  .pipe(gulp.dest('js/'));

Also it will be nice to have unpipeOnError option inside a pipe function to allow partially soft pipelines:

gulp.src('coffee/**/*.coffee', { logOnError: true })
  .pipe(gulpPrefixer('// Copyright 2014 (C) Aswesome company'))
  .pipe(coffee(), { unpipeOnError: false })
  .pipe(gulp.dest('js/'));

This seems overcomplicated...

I'm for logOnError: true or logOnError: gutil.log config option.

I'm little unclear on how unpipeOnError resolves the issues mentioned in your gist. I haven't looked extensively under the hood of node.js streams.

This issue affecting gulp-watch as well, if error occured in plugin - this plugin will be unpiped from source and will not be receiving vinyl files.

I published gulp-plumber which will contain some "pipe-helpers". For now it only fixes unpiping behaviour on all streams, that are down the pipeline.

var gulp = require('gulp'),
    watch = require('gulp-watch'),
    plumber = require('gulp-plumber'),
    sass = require('gulp-sass');

gulp.task('default', function () {
    gulp.src('scss/**', { read: false })
        .pipe(watch())
        .pipe(plumber())
        .pipe(sass())
        .pipe(gulp.dest('./dist/'));
});

gulp-plumber works pretty well. People using this, however, should be aware of plugins using es.map.