Node.js 通过Grunt运行节点应用程序

Node.js 通过Grunt运行节点应用程序,node.js,process,gruntjs,spawn,Node.js,Process,Gruntjs,Spawn,我正在尝试将节点应用程序作为Grunt任务运行。但是,我需要将其作为子进程生成,以允许我并行运行watch任务 这项工作: grunt.registerTask('start', function () { grunt.util.spawn( { cmd: 'node' , args: ['app.js'] }) grunt.task.run('watch:app') }) 但是,当监视任务检测到更改时,这将再次触发启动任务。在生成我的节点应用程序的另一个子进

我正在尝试将节点应用程序作为Grunt任务运行。但是,我需要将其作为子进程生成,以允许我并行运行watch任务

这项工作:

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

  grunt.task.run('watch:app')
})
但是,当监视任务检测到更改时,这将再次触发启动任务。在生成我的节点应用程序的另一个子进程之前,我需要杀死前一个子进程

然而,我不知道如何终止这个过程。像这样的事情是行不通的:

var child

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

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

  • 即使我将生成的进程存储在函数上下文之外的变量中,它也不会持久化,因此下次运行启动任务时,子进程是未定义的
  • child
    没有
    kill
    功能

  • 这是因为
    grunt contrib watch
    当前将所有任务运行作为子进程生成。因此变量
    child
    不在同一流程上下文中。很快,
    grunt contrib-watch@0.3.0
    将使用
    nospawn
    选项释放。这将允许您配置监视以在同一上下文中生成任务运行,并使上述示例正常工作

    有关更多信息,请查看此问题:


    看看哪个处理了与生成子进程相关的许多头痛问题。

    我刚刚用分支替换了我的
    grunt contrib watch
    模块,并将
    nospawn
    选项设置为true:<代码>子项仍然未在第二个函数调用中定义。另外,您知道如何终止子进程吗?Grunfile不是json文件,只是js文件。您也不需要使用grunt.task.run()调用watch任务。下面是一个使用watch共享上下文的示例:要杀死一个子进程do:
    child.kill('SIGINT')它是JS,我刚刚提取了相关的位,很抱歉混淆了。我不明白为什么
    child
    仍然是未定义的,即使我确信
    nospawn
    设置为true并且我安装了正确的模块。让它工作吧!演示的代码是正确的,我只是在我的
    包.json中发生了一些事情。非常感谢。