2013-02-23 5 views
13

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:

  1. 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.
  2. child non ha kill funzione ...

risposta

4

Questo perché grunt-contrib-watch genera attualmente tutte le attività viene eseguita come processi figli. Quindi la variabile child non si trova nello stesso contesto di processo. A breve, [email protected] verrà rilasciato con l'opzione nospawn. Ciò consentirà di configurare l'orologio per generare le esecuzioni di attività all'interno dello stesso contesto e renderebbe funzionante l'esempio sopra riportato.

Date un'occhiata a questo problema per un po 'più di informazioni:

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

+0

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? –

+0

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 –

+1

Per uccidere un processo figlio: 'child.kill ('SIGINT');' –

5

Date un'occhiata a grunt-nodemon che gestisce un sacco di mal di testa legati alla deposizione delle uova un processo figlio.