используйте grunt для перезапуска процесса phantomjs

Я использую 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 не завершается, потому что я использую его в качестве веб-сервера для сервера 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); 
    });
});

person AntouanK    schedule 24.08.2013    source источник


Ответы (1)


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

Собственная функция 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();
    });

});
person Marc Diethelm    schedule 24.08.2013
comment
Я просто играю с grunt, чтобы ознакомиться с ним, прежде чем использовать его. Таким образом, мы снова вручную убиваем процесс. Я не знал, что мы можем использовать событие «выход» вот так. Вы уверены, что всякий раз, когда часы перезагружают задачи, это событие «выход» срабатывает? Убить его при выходе, конечно, в лучшем случае. - person AntouanK; 24.08.2013
comment
Извините, я перепутал ваш вариант использования с тем, что прочитал на другой вкладке. Только что внес некоторые изменения в фрагмент кода, который, по моему мнению, будет соответствовать вашему варианту использования. Однако это не работает. Gruntfile.js выполняется заново каждый раз, когда наблюдатель обнаруживает изменение. Таким образом, постоянная ссылка на фантомы невозможна. Во всяком случае, не так. - person Marc Diethelm; 24.08.2013