2013-04-24 72 views
16

我目前正在嘗試執行幾個步驟,需要將任務產生到子進程中。例如:當Grunt退出時殺死產生的進程

  1. 觀看文件
  2. 啓動我的靜態網站生成的預覽服務器

,我可以很容易地使用一個任務,如grunt-concurrent有這兩個同時運行。但是,當我退出grunt時,子進程(在這種情況下 - 我使用grunt-shell運行的靜態站點生成器)繼續運行。我想讓這些任務同時運行 - 但是也會讓他們在咕嚕聲退出時被殺死。

想法?

回答

0

有沒有理由不使用grunt-contrib-connect來啓動項目根目錄中的服務器?

如果有可能做到這一點,而不是使用咕嚕殼,服務器將自動關閉,當你的咕嚕過程出來

+0

偉大的一點 - 但不幸的沒有。我正在使用Wintersmith作爲我的站點生成器(它使用Connect服務器) - 但我想避免必須複製該預覽服務器的邏輯。 – dtuckernet 2013-05-08 01:32:05

1

不知道這是如何工作與咕嚕殼。但是,如果你想建立一個自定義的咕嚕任務運行服務器,你可以嘗試財產以後這樣的:

var spawn = require('child_process').spawn; 
    var server = spawn('myserver', ['--foo']); 
    process.on('exit', function() { 
    grunt.log.writeln('killing myserver...'); 
    server.kill(); 
    grunt.log.writeln('killed myserver'); 
    }); 
+1

不幸的是,我嘗試過沒有成功(沒有寫入消息或服務器被終止)。 – Pat 2014-03-26 20:54:08

+0

這是我口味最好的答案。簡單,直截了當。沒有學習曲線..如果事情很簡單,我真的不支持使用庫。從技術上講,grunt shell插件應該在內部完成。一個簡單的小姐。 – 2015-05-10 11:42:37

0

顯然,grunt-shell不處理process退出事件:https://github.com/sindresorhus/grunt-shell/blob/master/tasks/shell.js

因此,我懷疑你的咕嚕進程退出和grunt-shell從不警告它的父進程正在停止子進程。

例如,grunt-concurrent確實殺死其子進程,因爲我們可以在這裏看到:

process.on('exit', function() { 
    cpCache.forEach(function (el) { 
     el.kill(); 
    }); 
}); 

來源:https://github.com/sindresorhus/grunt-concurrent/blob/master/tasks/concurrent.js#L55

因此,使用grunt-shell不會爲你工作。

一個解決方案是在您的Gruntfile中需要wintersmith並在自定義任務中以編程方式運行它。