Ejecutando la aplicación Node a través de Grunt

Estoy intentando ejecutar mi aplicación Node como una tarea Grunt. Sin embargo, tengo que generar esto como un proceso secundario para poder ejecutar la tarea de vigilancia en paralelo.

Esto funciona:

grunt.registerTask('start', function () { grunt.util.spawn( { cmd: 'node' , args: ['app.js'] }) grunt.task.run('watch:app') }) 

Sin embargo, cuando la tarea de observación detecta cambios, esto activará la tarea de inicio nuevamente. Antes de generar otro proceso secundario de mi aplicación Node, debo eliminar el anterior.

Sin embargo, no puedo averiguar cómo matar el proceso. Algo como esto no funciona:

 var child grunt.registerTask('start', function () { if (child) child.kill() child = grunt.util.spawn( { cmd: 'node' , args: ['app.js'] }) grunt.task.run('watch:app') }) 

Parece que:

  1. A pesar de que almaceno el proceso generado en una variable fuera del contexto de la función, no persiste, por lo que la próxima vez que se ejecute la tarea de inicio, el hijo undefined está undefined .
  2. child no tiene función de kill

Esto se debe a que grunt-contrib-watch actualmente genera todas las tareas ejecutadas como procesos secundarios. Así que la variable child no está dentro del mismo contexto de proceso. grunt-contrib-watch@0.3.0 pronto, grunt-contrib-watch@0.3.0 se lanzará con una opción nospawn . Esto le permitirá configurar la ejecución del reloj para generar tareas en el mismo contexto y haría que su ejemplo anterior funcione.

Echa un vistazo a este tema para un poco más de información:

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

Eche un vistazo a grunt-nodemon que maneja muchos de los dolores de cabeza relacionados con el proceso de engendrar un niño.