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.
thanks