一尘不染

通过Grunt运行Node应用

node.js

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

这有效:

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功能…

阅读 204

收藏
2020-07-07

共1个答案

一尘不染

这是因为grunt-contrib-watch当前将所有任务运行作为子进程生成。因此,该变量child不在同一过程上下文中。很快grunt- contrib-watch@0.3.0就会发布,并带有一个nospawn选项。这将使您配置监视以在相同的上下文中生成任务运行,并使上面的示例正常工作。

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

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

2020-07-07