Gulp Watch和Nodemon冲突

时间:2014-05-07 00:05:09

标签: gulp nodemon

缺少它:最近开始使用Gulp(从Grunt转换),并尝试使用Gulp的默认监视任务(不是从npm gulp-watch)用于SASS / JS / HTML和gulp-nodemon(来自npm)在更改时重新启动Express服务器。当只运行gulp watch时,它运行正常;当运行gulp server(对于nodemon)工作正常。但是,将两者结合使用(如下面的默认任务配置所示),手表的功能并不起作用。任务正在运行,并在CLI上显示' Starting'和'已完成'对于观看任务,但文件不会更新。

相关任务配置:

Concat javascript:

    gulp.task('js:app', function(){
        return gulp.src([
            pathSource('js/application/modules/**/*.js'),
            pathSource('js/application/_main.js')
        ])
        .pipe(concat('application.js'))
        .pipe(gulp.dest('./build/assets/js')).on('error', utils.log);
    });

Nodemon,重新启动更改以表达app:

    gulp.task('express', function(){
        return nodemon({script:'server.js', ext:'js', cwd: __dirname + '/express', legacyWatch: true})
        .on('restart', function(){
            //gulp.run('watch'); // doesn't work :(
        });
});

观看javascript更改,并运行js:app进行concat&#39>。

    gulp.task('watch', function(){
      gulp.watch(pathSource('js/application/**/*.js'), ['js:app']);
    });

默认任务,同时初始化gulp watch和nodemon:

    gulp.task('default', ['watch', 'express']);

如果有人有任何想法,请提前感谢!

2 个答案:

答案 0 :(得分:16)

gulp.run来电已deprecated,所以我会尝试不同的方法。由于您已经在使用gulp,我建议您试试gulp-nodemon吗?

根据gulp-nodemon documentation,您可以传递一系列要执行的任务:

更新:以下是完整的gulpfile.js文件以及工作示例on github

'use strict';

// Main dependencies and plugins
var gulp = require('gulp');
var jshint = require('gulp-jshint');
var concat = require('gulp-concat');
var uglify = require('gulp-uglify');
var rename = require('gulp-rename');
var nodemon = require('gulp-nodemon');

var assets = 'assets/js/**/*.js';
var publicDir = 'public/javascripts';

// Lint Task
gulp.task('lint', function () {
  return gulp.src(assets)
    .pipe(jshint())
    .pipe(jshint.reporter('jshint-stylish'));
});

// Concatenate and minify all JS files
gulp.task('scripts', function () {
  return gulp.src(assets)
    .pipe(concat('global.js'))
    .pipe(gulp.dest(publicDir))
    .pipe(rename('global.min.js'))
    .pipe(uglify())
    .pipe(gulp.dest(publicDir));
});

// Watch Files For Changes
gulp.task('watch', function () {
  gulp.watch(assets, ['lint', 'scripts']);
});

gulp.task('demon', function () {
  nodemon({
    script: 'server.js',
    ext: 'js',
    env: {
      'NODE_ENV': 'development'
    }
  })
    .on('start', ['watch'])
    .on('change', ['watch'])
    .on('restart', function () {
      console.log('restarted!');
    });
});

// Default Task
gulp.task('default', ['demon']);

这样,您在nodemon启动时生成watch任务,并确保每当nodemon重新启动您的应用程序时再次触发watch任务。

编辑似乎您应该调用on - change event from gulp-nodemon,它将在 {{}之前处理编译任务 1}}事件触发器。

编辑:似乎nodemon的restart已从其API

中移除

答案 1 :(得分:4)

FWIW,似乎在gulp-nodemon的配置中使用cwd参数实际上将整个gulp cwd设置为该目录。这意味着将来的任务将在错误的目录中执行。

我在我的前端服务器上运行gulp watch任务时遇到此问题,同时我的后端服务器上的nodemon任务(在同一个gulp文件中),有一个竞争条件,如果首先执行nodemon命令,前端东西实际上会构建到(Home)/ backend / frontend而不是(Home)/ frontend,而且一切都会从那里变形。

我发现在gulp-nodemon上使用watch和script params可以解决这个问题(尽管看起来nodemon仍然看着我的整个项目进行更改而不是内置的后端目录)。