【问题标题】:Running Node app through Grunt通过 Grunt 运行 Node 应用程序
【发布时间】: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')
})

看来:

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

【问题讨论】:

    标签: node.js process gruntjs spawn


    【解决方案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/5021187child 仍未在第二个函数调用中定义。另外,你知道我怎样才能杀死子进程吗?
      • Gruntfile 不是一个 json 文件,只是一个 js 文件。您也不需要使用 grunt.task.run() 调用监视任务。以下是使用手表共享上下文的示例:github.com/gruntjs/grunt-contrib-watch/blob/nospawn/test/…
      • 杀死一个子进程:child.kill('SIGINT');
      • 是 JS,我只是提取了相关的部分,抱歉造成混淆。我无法弄清楚为什么 child 仍然未定义,即使我确定 nospawn 设置为 true 并且我安装了正确的模块。
      • 开始工作了!演示的代码是正确的,我的package.json 刚刚发生了一些事情。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2018-01-17
      • 2023-04-04
      • 2014-12-21
      相关资源
      最近更新 更多