# Recipes * [Prevent pipe breaking on errors](#prevent-pipe-breaking-on-errors) * [Starting tasks on events](#starting-tasks-on-events) * [Filtering custom events](#filtering-custom-events) * [Incremental build](#incremental-build) ### Prevent pipe breaking on errors > Until gulp 4.0 is released this is actual information When you pipe one Stream to another and do not attaching `on('error')` handler they will `unpipe` on every error. This is frustrating, when you have watcher and something like `coffeescript` builder. It is pretty easy to put typo in file and breake pipeline forever. To avoid this, you can use [`gulp-plumber`](https://github.com/floatdrop/gulp-plumber): ```js var gulp = require('gulp'); var watch = require('gulp-watch'); var plumber = require('gulp-plumber'); var sass = require('gulp-ruby-sass'); gulp.task('styles', function () { return gulp.src('scss/*.scss') .pipe(watch('scss/*.scss')) .pipe(plumber()) .pipe(sass()) .pipe(gulp.dest('dist')); }); ``` ### Starting tasks on events Often you want just to launch some tasks (like `build`) when something happened to watched files. You can pass plain callback, that will be called on every event or wrap it in `gulp-batch` to run it once: ```js var gulp = require('gulp'); var watch = require('gulp-watch'); var batch = require('gulp-batch'); gulp.task('build', function () { console.log('Working!'); }); gulp.task('watch', function () { watch('**/*.js', batch(function (events, done) { gulp.start('build', done); })); }); ``` ### Filtering custom events When you want to make actions only on specific events, you can use [`gulp-filter`](https://github.com/sindresorhus/gulp-filter) and the `event` attribute, which is added to all files that were `add`, `change` or `unlink` (per [`chokidar`'s documentation](https://github.com/paulmillr/chokidar#events)): ```js var filter = require('gulp-filter'); function isAdded(file) { return file.event === 'add'; } var filterAdded = filter(isAdded); gulp.task('default', function () { return gulp.src('**/*.js') .pipe(watch('**/*.js')) .pipe(filterAdded) .pipe(gulp.dest('newfiles')) .pipe(filterAdded.restore()) .pipe(gulp.dest('oldfiles')); }); ``` **Notice:** `event` property is not added to files that were emitted by `emitOnGlob` and `emit: 'all'` options, only to files that actually caused the event. ### Incremental build One of the nice features, that can be achieved with `gulp-watch` - is incremental build. When you want to build all files at start and then get only changed files - you can use these snippets: ```js gulp.task('default', function () { return gulp.src('**/*.js') .pipe(watch('**/*.js')) .pipe(gulp.dest('build')); }); ```