通过Grunt运行Node应用程序

时间:2013-02-23 18:28:41

标签: node.js process gruntjs spawn

我正在尝试将我的Node应用程序作为Grunt任务运行。但是,我需要将它作为子进程生成,以允许我并行运行监视任务。

这有效:

grunt.registerTask('start', function () {
  grunt.util.spawn(
    { cmd: 'node'
    , args: ['app.js']
    })

  grunt.task.run('watch:app')
})

但是,当监视任务检测到更改时,这将再次触发启动任务。在我生成我的Node应用程序的另一个子进程之前,我需要杀死前一个。

但是,我无法弄清楚如何杀死这个过程。这样的事情不起作用:

var child

grunt.registerTask('start', function () {
  if (child) child.kill()
  child = grunt.util.spawn(
    { cmd: 'node'
    , args: ['app.js']
    })

  grunt.task.run('watch:app')
})

看来:

  1. 即使我将生成的进程存储在函数上下文之外的变量中,它也不会保留,因此下次启动任务时,child为undefined
  2. child没有kill功能......

2 个答案:

答案 0 :(得分:5)

看一下处理与产生子进程有关的许多麻烦的grunt-nodemon

答案 1 :(得分:4)

这是因为grunt-contrib-watch当前会将所有任务运行作为子进程生成。因此变量child不在同一个进程上下文中。很快,grunt-contrib-watch@0.3.0将以nospawn选项发布。这将允许您配置手表在同一上下文中生成任务运行,并使您的上述示例工作。

请查看此问题以获取更多信息:

https://github.com/gruntjs/grunt-contrib-watch/issues/45