Sto tentando di eseguire l'applicazione Node come attività Grunt. Ho bisogno di generare questo come un processo figlio, tuttavia, per consentirmi di eseguire l'attività di controllo in parallelo.Esecuzione dell'app Node tramite Grunt
Questo funziona:
grunt.registerTask('start', function() {
grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
Tuttavia, quando i cambiamenti vengono rilevati dal compito orologio, questo innescherà nuovamente l'attività di avvio. Prima di generare un altro processo figlio della mia app Node, devo uccidere il precedente.
Non riesco a capire come uccidere il processo, tuttavia. Qualcosa di simile a questo non funziona:
var child
grunt.registerTask('start', function() {
if (child) child.kill()
child = grunt.util.spawn(
{ cmd: 'node'
, args: ['app.js']
})
grunt.task.run('watch:app')
})
sembra che:
- Anche se devo conservare il processo generato in una variabile al di fuori del contesto funzione, non persiste, così la prossima volta che il viene avviata l'attività, il figlio è
undefined
. child
non hakill
funzione ...
Ho appena sostituito il mio modulo 'grunt-contrib-watch' con il ramo [nospawn] (https://github.com/gruntjs/grunt-contrib-watch/tree/nospawn) e ho impostato' nospawn' opzione su true: https://gist.github.com/OliverJAsh/5021187. 'child' non è ancora definito nella seconda chiamata di funzione. Inoltre, sai come posso uccidere il processo figlio? –
Il file Grunt non è un file json, solo un file js. Inoltre, non è necessario chiamare l'attività di controllo con grunt.task.run(). Ecco un esempio che utilizza l'orologio per condividere il contesto: https://github.com/gruntjs/grunt-contrib-watch/blob/nospawn/test/fixtures/nospawn/Gruntfile.js#L35 –
Per uccidere un processo figlio: 'child.kill ('SIGINT');' –