Запуск приложения 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
...
Ответы
Ответ 1
Это потому, что grunt-contrib-watch
в настоящее время порождает все прогоны задач как дочерние процессы. Таким образом, переменная child
не входит в один и тот же контекст процесса. Довольно скоро [email protected]
будет выпущен с опцией nospawn
. Это позволит вам настроить часы для запуска задач запуска в том же контексте и сделает ваш вышеприведенный пример работы.
Посмотрите на эту проблему для получения дополнительной информации:
https://github.com/gruntjs/grunt-contrib-watch/issues/45
Ответ 2
Взгляните на grunt-nodemon, который обрабатывает множество головных болей, связанных с нерестом дочернего процесса.