异常时自动重启 gulp nodejs

Posted

技术标签:

【中文标题】异常时自动重启 gulp nodejs【英文标题】:Auto restart gulp nodejs on exception 【发布时间】:2015-10-10 11:11:42 【问题描述】:

我有一个使用 gulp 脚本运行的 nodejs 应用程序。这个 gulp 是从永远开始的。

forever start gulp

当任何异常被抛出时,它就会被冻结并显示以下错误消息。

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

对于这个异常,我知道不需要更改文件,它只是由一些连接超时事件引起的。

所以,它是一个永远 + gulp + nodejs

我们可以在任何异常情况下自动重新启动这个 gulp 脚本吗?任何建议都会很有帮助。

更新 1:

Gulp 脚本

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'
    ]))
);

【问题讨论】:

似乎也涉及到了nodemon。你能发布 gulp 脚本吗? @ZeMoon - 我已经用 gulp 脚本更新了 【参考方案1】:

全局安装nodemon npm i -g nodemon

并在您的 .bashrc(或 .bash_profile 或 .profile)中添加一个别名 alias gulp='nodemon --watch gulpfile.js --watch gulpfile.babel.js --quiet --exec gulp'

这将监视文件 gulpfile.js 和 gulpfile.babel.js(参见 Google)的变化

附言。这对无休止的任务(如手表,...)很有帮助,但对单次运行的任务没有帮助。我的意思是它使用 watch 所以即使在 gulp 任务完成后它也会继续处理。 ;) p.s.2。 nodemon 有标志在崩溃时退出它是--exitcrash。所以不要包括它:)

【讨论】:

以上是关于异常时自动重启 gulp nodejs的主要内容,如果未能解决你的问题,请参考以下文章

nodejs 模块恩仇录

如何使用 nodejs 和 typescript 自动重启节点应用程序?

AWS EB 实例崩溃时是不是会自动重启?

PHPWAMP自启异常,服务器重启后Apache等服务不会自动重启的原因分析

nodejs之pm2自动重启服务

Nodejs 文件修改自动重启扩展