Gulp Watch 和 Nodemon 冲突

Posted

技术标签:

【中文标题】Gulp Watch 和 Nodemon 冲突【英文标题】:Gulp Watch and Nodemon conflict 【发布时间】:2014-06-23 18:23:07 【问题描述】:

简短地说:最近开始使用 Gulp(从 Grunt 转换),并且我尝试将 Gulp 的默认监视任务(不是来自 npm 的 gulp-watch)用于 SASS/JS/html 和 gulp-nodemon(来自 npm)更改后重新启动 Express 服务器。仅运行gulp watch 时,它工作正常;并且在运行gulp server(对于nodemon)时工作正常。但是,同时使用两者(如下所示的默认任务配置),手表的东西不起作用。该任务正在运行,并且在 CLI gulp 上显示监视任务的“正在启动”和“已完成”,但文件不会更新。

相关任务配置:

连接 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,对 express 应用的更改重新启动:

    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 进行连接。

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

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

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

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

【问题讨论】:

【参考方案1】:

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 任务。

编辑看来你应该调用changeevent from gulp-nodemon,它将在restart 事件触发之前处理编译任务

编辑:似乎 nodemon 的 on('change', callback) 已从他们的 API 中删除

【讨论】:

gaston - 我正在使用的设置实际上已经带有 gulp-nodemon;但是,我没有对其进行配置,以便它在更改时重新启动监视任务。我会试一试,让你知道。谢谢! 所以无法让它以这种方式工作。让我感到困惑的是:如果我像这样运行 nodemon 任务:gulp.task('demon', ['watch'], function() nodemon(...) ),nodemon 和 watch 任务都将执行并在文件更改时显示输出 - 但 watch 任务的更改不会写入适当的文件。就像任务运行一样,但它没有将更改通过管道传输到磁盘。 @jiveTurkey 我已经用完整的 gulpfile 更新了我的答案,并留下了一个有效的github sample。基本上,这将启动nodemon 并将其与gulp-watch 任务链接以监控文件更改。让我知道进展如何;) 感谢您的回答,加斯顿。这就像一个魅力,真的帮助了我!在我的 gulpfile.js 中,我删除了 .on('change', ['watch']),因为 watch 任务运行了两次,一次是在更改之前,一次是在服务器重新启动之后。 @Gaston - 再次感谢您的帮助,不幸的是,上述方法并没有解决问题(尽管它让我走上了正确的轨道:)。似乎独立运行“watch”任务或“nodemon”任务都可以正常工作。但是,如果 nodemon 配置有cwd: 'something_relative_here',那将影响监视任务使用的路径。你会认为它们是完全隔离的,但由于某种原因,nodemon 中的 cwd 属性会影响 gulp.watch(...) 配置中的路径。解决方案是使路径成为绝对路径。不理想。将在下面发布完整的解释。【参考方案2】:

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

我在前端服务器上同时运行 gulp watch 任务和后端服务器上的 nodemon 任务时遇到了这个问题(在同一个 gulpfile 中),如果先执行 nodemon 命令,前端会出现竞争情况东西实际上会构建到 (Home)/backend/frontend 而不是 (Home)/frontend 中,并且一切都会从那里变成梨形。

我发现在 gulp-nodemon 上使用 watch 和 script 参数可以解决这个问题(尽管它看起来仍然像 nodemon 正在监视我的整个项目而不是构建的后端目录)。

【讨论】:

以上是关于Gulp Watch 和 Nodemon 冲突的主要内容,如果未能解决你的问题,请参考以下文章

将参数从脚本传递给 gulp 任务

Gulp-nodemon 和监视任务

json Gulp,BrowserSync,Node和Nodemon都协调工作。 ;)

Webpack --watch 和启动 nodemon?

将 browsersync 与 gulp/nodemon 一起使用

gulp & nodemon 导致的内存泄漏