Grunt中类似Nodemon的任务:执行节点进程并观察

Aug*_*ger 28 watch spawn node.js gruntjs

我觉得我错过了什么.

这是我想要实现的目标:

有一个执行我的grunt任务server.js并且watch并行运行任务.我觉得这正是grunt设计的任务之一,但我无法实现这种配置.

其中,我读过这个: 通过Grunt运行Node应用程序, 但我仍然无法做到.

这是我的Gruntfile.js:

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    watch: {
      scripts: {
        files: ['*.js'],
        tasks: ['start'],
        options: {
          nospawn: true
        }
      }
    }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');

  grunt.registerTask('start', function() {
    grunt.util.spawn({
      cmd: 'node',
      args: ['server.js']
    });
    grunt.task.run('watch');
  });

  grunt.registerTask('default', 'start');
};
Run Code Online (Sandbox Code Playgroud)

"grunt-contrib-watch": "~0.3.1"应该是比grunt-contrib-watch@0.3.0前面提到的帖子更高的版本.

如果你能帮助我实现正确的配置,我将非常感激.但更多的是,我不明白为什么没有正式的grunt-contrib-nodemon-like包装和任务,因为我觉得使用grunt是另一个很好的理由(我真的很喜欢它作为工具!)

谢谢

nac*_*son 27

编辑:grunt-nodemon

自写这篇文章以来,一个好人开发了这个.


我使用grunt.util.spawn来解决新进程时遇到了很多麻烦.他们会跑,但他们不会给我任何输出.也许你可以弄清楚我在这些文档中无法做到的事情.http://gruntjs.com/api/grunt.util#grunt.util.spawn

我看到你遇到的两个问题:

  • 我认为当你使用回调函数来运行你的任务时,grunt.registerTask()必须带三个参数.
  • 我不认为你node server.js每次文件更改时都可以反复调用.它将在第一次工作,因为它真正起作用,您必须将服务器作为子进程进行管理,在后续文件更改时终止并重新启动它.

对于registerTask参数尝试这个,只是为了看看你是否可以在当前的实现中使用某些东西.

http://gruntjs.com/api/grunt.task#grunt.task.registertask

它需要(taskName, description, taskFunction)这样:

grunt.registerTask('start', 'My start task description', function() {
  grunt.util.spawn({
    cmd: 'node',
    args: ['server.js']
  });
  grunt.task.run('watch');
});
Run Code Online (Sandbox Code Playgroud)

这可能至少让您watchnode server.js文件第一次更改时运行.

这就是我要做的事情.

要么只是按$ nodemon server.js原样使用nodemon

要么...

阅读源代码并使用grunt-develop

他将服务器作为子进程管理,可能就是您正在寻找的.

要么...

得到咕噜声
npm install grunt-shell --save-dev

并使用它为您运行nodemon:

module.exports = function(grunt) {

  // Project configuration.
  grunt.initConfig({
    serverFile: 'server.js',
    shell: {
      nodemon: {
        command: 'nodemon <%= serverFile %>',
        options: {
          stdout: true,
          stderr: true
        }
      }
    },
    watch: { /* nothing to do in watch anymore */ }
  });

  grunt.loadNpmTasks('grunt-contrib-watch');
  grunt.loadNpmTasks('grunt-shell');

  grunt.registerTask('default', 'shell:nodemon');
};
Run Code Online (Sandbox Code Playgroud)

$ grunt shell:nodemon

我衷心希望有所帮助.祝好运!

  • 我认为`livereload`中的服务器只是为了通过websockets重新加载资产,应该保持独立.可能是错的. (2认同)