node.js - Auto restart gulp nodejs on exception -


i have nodejs app running gulp script. gulp started forever.

forever start gulp 

when exception thrown, gets freezed below error msg.

[gulp] [nodemon] app crashed - waiting file changes before starting... 

here exception know there no file change required, caused connection timeout event.

so, forever + gulp + nodejs

can automatically restart gulp script on exception? suggestions helpful.

update 1:

gulp script

var fs            = require('fs'),     path          = require('path'),     gulp          = require('gulp'),     gutil         = require('gulp-util'),     es            = require('event-stream'),     concat        = require('gulp-concat'),     runsequence   = require('gulp-run-sequence'),     templatecache = require('gulp-angular-templatecache'),     minifyhtml    = require('gulp-minify-html'),     ngmin         = require('gulp-ngmin'),     less          = require('gulp-less'),     rimraf        = require('gulp-rimraf'),     jshint        = require('gulp-jshint'),     stylish       = require('jshint-stylish'),     uglify        = require('gulp-uglify'),     minifycss     = require('gulp-minify-css'),     gulpif        = require('gulp-if'),     nodemon       = require('gulp-nodemon'),     _             = require('lodash'),     moment        = require('moment'),     shell         = require('gulp-shell'),     minimist      = require('minimist'),     rename        = require('gulp-rename');  var base        = 'src/client/app',     assets_base = 'src/client/assets'  var appfiles      = applyprefix(base,        ['/entry/app.js', '/**/*.js']),     templatefiles = applyprefix(base,        ['/**/*.html']),     lessfiles     = applyprefix(base,        ['/entry/less/main.less', '/**/*.less']),     adminless     = applyprefix(base,        ['/entry/less/admin.less']),     libfiles      = applyprefix(assets_base, ['/js/lib/jquery.min.js', '/js/lib/lodash.min.js', '/js/lib/angular.min.js', '/js/lib/**/*.js', '/js/components/**/*.js']),     assetfiles    = applyprefix(assets_base, ['/fonts/**/*', '/img/**/*', '/translations/**/*', '/favicon.ico']),     viewsfiles    = applyprefix(base,        ['/entry/views/*.html']);  var compile = gutil.env.compile;  gulp.task('default', function(cb) {   runsequence(     'clean',     ['scripts', 'assets', 'less', 'adminless', 'views'],     'watch',     cb   ); });  gulp.task('clean', function() {   return gulp.src('src/server/public', { read: false })            .pipe(rimraf()); });  gulp.task('scripts', function() {     gulp.src(['src/server/public/js/*main.js', 'src/server/public/js/*lib.js', 'src/server/public/js/*templates.js'], { read: false })       .pipe(rimraf());      var buildtimestamp = moment().format("mm-d-yyyy-hh:mm:ss");      fs.writefile('src/server/js-build-timestamp.json', json.stringify({ buildtimestamp: buildtimestamp }), function(err) {       if (err) return console.log("could not create js-build-timestamp file");       console.log("created js-build-timestamp file: " + buildtimestamp);     });      // app files     gulp.src(appfiles)       .pipe(jshint({         strict: false,         laxbreak: true,         debug: true,         globals: {           angular: true,           $: true,           _: true         }     }))     .pipe(jshint.reporter(stylish))     .pipe(concat(buildtimestamp + '-main.js'))     .pipe(gulpif(compile, ngmin()))     .pipe(gulpif(compile, uglify()))     .pipe(gulp.dest('src/server/public/js'));    // template files   gulp.src(templatefiles)     .pipe(minifyhtml({       empty: true,       spare: true,       quotes: true     }))     .pipe(templatecache({       module: 'xxxprojname',       root: '',       base: function(file) {         return 'templates/' + path.basename(file.relative);       }     }))     .pipe(concat(buildtimestamp + '-templates.js'))     .pipe(gulpif(compile, ngmin()))     .pipe(gulpif(compile, uglify()))     .pipe(gulp.dest('src/server/public/js'));    // library files   gulp.src(libfiles)     .pipe(concat(buildtimestamp + '-lib.js'))     .pipe(gulpif(compile, uglify({       preservecomments: 'some'     })))     .pipe(gulp.dest('src/server/public/js')); });  gulp.task('less', function() {   gulp.src(['src/server/public/css/*.css'], { read: false })     .pipe(rimraf());    var buildtimestamp = moment().format("mm-d-yyyy-hh:mm:ss");   fs.writefile('src/server/css-build-timestamp.json', json.stringify({ buildtimestamp: buildtimestamp }), function(err) {     if (err) return console.log("could not create css-build-timestamp file");     console.log("created css-build-timestamp file: " + buildtimestamp);   });    gulp.src(lessfiles[0])     .pipe(less())     .pipe(rename(buildtimestamp + '-main.css'))     .pipe(gulpif(compile, minifycss()))     .pipe(gulp.dest('src/server/public/css')); });  gulp.task('adminless', function() {   gulp.src(adminless)     .pipe(less())     .pipe(gulpif(compile, minifycss()))     .pipe(gulp.dest('src/server/public/css')); });  gulp.task('assets', function() {   gulp.src(assetfiles, { base: assets_base})     .pipe(gulp.dest('src/server/public/')); });  gulp.task('views', function() {   gulp.src(viewsfiles)     .pipe(gulp.dest('src/server/views/')); });  gulp.task('watch', function() {   if (compile) return;    gulp.watch([appfiles, templatefiles, libfiles], ['scripts']);   gulp.watch(['client/index.html', assetfiles], ['assets']);   gulp.watch([lessfiles], ['less', 'adminless']);   gulp.watch([viewsfiles], ['views']);    nodemon({     script: 'src/server/server.js',     watch: 'src/server',     ext: 'json js',     ignore: ['client/*, src/server/public/*']   }); });  function applyprefix(prefix, filenames) {   return _.map(filenames, function(filename) {     return prefix + filename;   }); }   gulp.task('bleh', function() {   gulp.src('')     .pipe(shell([       'touch test'     ])) }); 

install nodemon globally npm -g nodemon

and add in .bashrc (or .bash_profile or .profile) alias alias gulp='nodemon --watch gulpfile.js --watch gulpfile.babel.js --quiet --exec gulp'

this watch file gulpfile.js , gulpfile.babel.js (see google) changes

p.s. can helpful endless tasks (like watch, ...) not single run tasks. mean uses watch continue process after gulp task done. ;) p.s.2. nodemon has flag exit on crash it's --exitcrash. don't include :)


Comments