Reputation:
I am trying to run my Node application as a Grunt task. I need to spawn this as a child process, however, to allow me to run the watch task in parallel.
This works:
grunt.registerTask('start', function () {
grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
However, when changes are detected by the watch task, this will trigger the start task again. Before I spawn another child process of my Node app, I need to kill the previous one.
I can't figure out how to kill the process, however. Something like this does not work:
var child
grunt.registerTask('start', function () {
if (child) child.kill()
child = grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
It appears that:
undefined
.child
has no kill
function…Upvotes: 13
Views: 14528
Reputation: 605
Take a look at grunt-nodemon which handles a lot of the headaches related to spawning a child process.
Upvotes: 5
Reputation: 13762
This is because grunt-contrib-watch
currently spawns all task runs as child processes. So the variable child
is not within the same process context. Fairly soon, [email protected]
will be released with a nospawn
option. This will let you configure the watch to spawn task runs within the same context and would make your above example work.
Take a look at this issue for a little more information:
https://github.com/gruntjs/grunt-contrib-watch/issues/45
Upvotes: 4