通过 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')
)
看来:
-
即使我将生成的进程存储在函数上下文之外的变量中,它也不会持续存在,因此下次运行启动任务时,子进程是
undefined
。
child
没有 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 应用程序的主要内容,如果未能解决你的问题,请参考以下文章