2013-08-24 2 views
4

Я использую grunt для выполнения некоторых задач каждый раз, когда я меняю свой код (например, jshint), и я хочу перезагружать процесс phantomJs каждый раз, когда у меня есть изменения.use 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 не является тематическим, потому что я использую его как веб-сервер для сервера REST API с JSON.

Могу ли я иметь ворчащий обратный вызов или что-то, когда часы срабатывают, поэтому я могу закрыть свой предыдущий процесс 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

Это совершенно непроверенные код может быть решением вашей проблемы.

Родительская нерезидентная функция Node 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

Я просто играю с ворчанием, чтобы познакомиться с ним, прежде чем использовать его. Таким образом, мы снова вручную уничтожаем процесс. Я не знал, что мы можем использовать событие «exit», подобное этому. Вы уверены, что всякий раз, когда часы перезагружают задачи, это событие «выхода» будет срабатывать? Конечно, убить его на «выходе» - это лучший случай. – AntouanK

+0

Извините, я смутил ваш прецедент с материалами, которые я читал на другой вкладке. Просто внесла некоторые изменения в фрагмент кода, с тем, что, как я думал, будет соответствовать вашему варианту использования. Однако он не работает. Gruntfile.js выполняется заново каждый раз, когда наблюдатель обнаруживает изменение. Таким образом, не существует постоянной ссылки на фантомы. Во всяком случае, это не так. –

 Смежные вопросы

  • Нет связанных вопросов^_^