2013-02-23 19 views
13

Próbuję uruchomić aplikację węzła jako zadanie Grunt. Muszę jednak odrodzić to jako proces potomny, aby umożliwić równoległe uruchamianie zadania oglądania.Uruchamianie aplikacji węzła poprzez Grunt

to działa:

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

    grunt.task.run('watch:app') 
}) 

Jednak, gdy zmiany są wykrywane przez zadanie zegarka, to będzie ponownie wywołać zadanie start. Zanim odrodzę kolejny proces potomny mojej aplikacji węzła, muszę zabić poprzednią.

Nie mogę jednak dowiedzieć się, jak zabić proces. Coś jak to nie działa:

var child 

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

    grunt.task.run('watch:app') 
}) 

Wydaje się, że:

  1. Nawet przechowywać zrodził proces w zmiennej poza kontekstem funkcji, nie ustępują, więc następnym razem uruchom zadanie, dziecko to undefined.
  2. child nie ma kill funkcja ...

Odpowiedz

4

To dlatego grunt-contrib-watch obecnie ikra wszystkim zadanie jest uruchamiane jako procesów potomnych. Zatem zmienna child nie znajduje się w tym samym kontekście procesu. Wkrótce zostanie opublikowany [email protected] z opcją nospawn. Umożliwi to skonfigurowanie zegarka do odrodzenia zadań w tym samym kontekście i sprawi, że powyższy przykład zadziała.

Spójrz na ten problem trochę więcej informacji:

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

+0

Właśnie zamieniłem mój moduł 'grunt-contrib-watch' na gałąź [nospawn] (https://github.com/gruntjs/grunt-contrib-watch/tree/nospawn) i ustaw' nospawn' opcja true: https://gist.github.com/OliverJAsh/5021187. 'child' nadal nie jest zdefiniowane w drugim wywołaniu funkcji. Czy wiesz, w jaki sposób mogę zabić proces potomny? –

+0

Gruntfile nie jest plikiem json, tylko plikiem js. Nie musisz też wywoływać zadania obserwacyjnego za pomocą metody grunt.task.run(). Oto przykład korzystania z zegarka w celu udostępnienia kontekstu: https://github.com/gruntjs/grunt-contrib-watch/blob/forenn/test/fixtures/forenn/Gruntfile.js#L35 –

+1

Aby zabić proces potomny: 'child.kill ('SIGINT');' –

5

Spójrz na grunt-nodemon który obsługuje wiele bólów głowy związanych tarła proces podrzędny.

Powiązane problemy