通过 Grunt 运行 Node 应用程序

Posted

技术标签:

【中文标题】通过 Grunt 运行 Node 应用程序【英文标题】:Running Node app through Grunt 【发布时间】:2013-02-09 05:49:00 【问题描述】:

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

这行得通:

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

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

但是,当 watch 任务检测到变化时,这会再次触发 start 任务。在生成 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')
)

看来:

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

【问题讨论】:

【参考方案1】:

看看grunt-nodemon,它处理了很多与生成子进程相关的问题。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

我刚刚用nospawn 分支替换了我的grunt-contrib-watch 模块并将nospawn 选项设置为true:gist.github.com/OliverJAsh/5021187。 child 仍未在第二个函数调用中定义。另外,你知道我怎样才能杀死子进程吗? Gruntfile 不是一个 json 文件,只是一个 js 文件。您也不需要使用 grunt.task.run() 调用监视任务。以下是使用手表共享上下文的示例:github.com/gruntjs/grunt-contrib-watch/blob/nospawn/test/… 杀死一个子进程:child.kill('SIGINT'); 是 JS,我只是提取了相关的部分,抱歉造成混淆。我无法弄清楚为什么 child 仍然未定义,即使我确定 nospawn 设置为 true 并且我安装了正确的模块。 开始工作了!演示的代码是正确的,我的package.json 刚刚发生了一些事情。谢谢。

以上是关于通过 Grunt 运行 Node 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

在 OpsWorks 中使用 Grunt 或 Gulp

‘grunt‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

grunt配置详情

grunt构建一个项目

在 Heroku 上运行 Grunt 构建任务

在 Heroku 上运行 Grunt Build 时出错