2013-08-24 91 views
4

我使用grunt在每次更改我的代碼時都完成了一些任務(例如jshint),並且我希望每次更改時都重新加載phantomJs進程。使用grunt重新啓動phantomjs進程

我發現的第一種方法是使用grunt.util.spawn首次運行phantomJs。

// http://gruntjs.com/api/grunt.util#grunt.util.spawn 
var phantomJS_child = grunt.util.spawn({ 
    cmd: './phantomjs-1.9.1-linux-x86_64/bin/phantomjs', 
    args: ['./phantomWorker.js'] 
}, 
function(){ 
    console.log('phantomjs done!'); // we never get here... 
}); 

然後,每次重新啓動手錶,另一個任務使用grunt.util.spawn殺phantomJs過程,這當然是非常難看。

有沒有更好的方法來做到這一點? 問題是phantomJs進程沒有被終止,因爲我使用它作爲web服務器來使用JSON來服務REST API。

當我重新運行任務以創建一個新任務之前,我是否可以收到一個咕嚕聲回調或什麼時候開始觀看,因此我可以關閉以前的phantomJs過程?

我用grunt.event來創建一個處理程序,但我看不到如何訪問phantomjs進程以殺死它。

grunt.registerTask('onWatchEvent',function(){ 

    // whenever watch starts, do this... 
    grunt.event.on('watch',function(event, file, task){ 
     grunt.log.writeln('\n' + event + ' ' + file + ' | running-> ' + task); 
    }); 
}); 

回答

0

完全未經測試代碼可能是你的問題的解決方案。

節點的本地子產卵函數exec立即返回對子進程的引用,我們可以繼續引用它以稍後將其殺死。要使用它,我們可以立即創建一個自定義的咕嚕任務,如下所示:

// THIS DOESN'T WORK. phantomjs is undefined every time the watcher re-executes the task 
var exec = require('child_process').exec, 
    phantomjs; 

grunt.registerTask('spawn-phantomjs', function() { 

    // if there's already phantomjs instance tell it to quit 
    phantomjs && phantomjs.kill(); 

    // (re-)start phantomjs 
    phantomjs = exec('./phantomjs-1.9.1-linux-x86_64/bin/phantomjs ./phantomWorker.js', 
     function (err, stdout, stderr) { 
      grunt.log.write(stdout); 
      grunt.log.error(stderr); 
      if (err !== null) { 
       grunt.log.error('exec error: ' + err); 
      } 
    }); 

    // when grunt exits, make sure phantomjs quits too 
    process.on('exit', function() { 
     grunt.log.writeln('killing child...'); 
     phantomjs.kill(); 
    }); 

}); 
+0

我只是在使用它之前先熟練地熟悉它。通過這種方式,我們再次手動殺死該進程。我不知道我們可以像這樣使用「退出」事件。你確定每當觀看重新加載任務時,這個'退出'事件會觸發?當然,在'退出'上殺死它是最好的例子。 – AntouanK

+0

對不起,我把你的用例與我在另一個選項卡上閱讀的東西混淆了。只是對代碼片段進行了一些編輯,我認爲會與您的用例相匹配。但它不起作用。每當觀察者檢測到更改時,都會重新執行Gruntfile.js。因此沒有持續參考phantomjs是可能的。反正也不是這樣。 –