我每次更改代码时都会使用grunt完成一些任务(例如jshint),并且每次更改时我都想重新加载一个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。
我可以在观看任何时候进行咕噜回叫或其他事情,这样我可以在重新运行创建新任务之前关闭之前的幻像进程吗?
我使用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 :(得分:0)
此完全未经测试的代码可以解决您的问题。
Node的本机子生成函数exec
会立即返回对子进程的引用,我们可以保留这些引用以便稍后将其删除。要使用它,我们可以动态创建一个自定义的grunt任务,如下所示:
// 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();
});
});