Подтвердить что ты не робот

Запуск приложения Node через Grunt

Я пытаюсь запустить приложение Node как задачу Grunt. Однако мне нужно создать это дочерний процесс, чтобы позволить мне запускать задачу просмотра параллельно.

Это работает:

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')
})

Похоже, что

  • Несмотря на то, что я храню порожденный процесс в переменной вне контекста функции, он не сохраняется, поэтому при следующем запуске задачи-потомке undefined.
  • child не имеет функции kill...
4b9b3361

Ответ 1

Это потому, что grunt-contrib-watch в настоящее время порождает все прогоны задач как дочерние процессы. Таким образом, переменная child не входит в один и тот же контекст процесса. Довольно скоро [email protected] будет выпущен с опцией nospawn. Это позволит вам настроить часы для запуска задач запуска в том же контексте и сделает ваш вышеприведенный пример работы.

Посмотрите на эту проблему для получения дополнительной информации:

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

Ответ 2

Взгляните на grunt-nodemon, который обрабатывает множество головных болей, связанных с нерестом дочернего процесса.