Лучший способ использовать отличные скрипты в приложении - PullRequest
2 голосов
/ 05 декабря 2010

Я пытаюсь использовать скрипты Groovy в своем приложении. Проблема в том, что GroovyScriptEngine # run всегда компилирует скрипт, даже если он был скомпилирован в предыдущих запусках и с тех пор не изменился. Даже если я установил физическую папку вывода для сохранения результатов компиляции в конфигурации.

Как лучше всего обойти это? Для меня оптимальным является то, что я могу отправить скрипт с папкой, содержащей предварительно скомпилированные результаты, и компиляция не производится (если, конечно, скрипт не изменен)

Ответы [ 3 ]

2 голосов
/ 05 декабря 2010

Grails 1.3.5 использует Groovy 1.7.5. В этой версии Groovy GroovyScriptEngine.run(..) вызывает следующие методы: createScript(String, Binding) -> loadScriptByName(String) -> isSourceNewer(ScriptCacheEntry).

isSourceNewer(ScriptCacheEntry) определяется как (к сожалению, я не нашел подходящий исходный файл в сети):

protected boolean isSourceNewer(ScriptCacheEntry entry) 
    throws ResourceException {
    // ...

    for (String scriptName : entry.dependencies) {
        // ...
        return true; // without any further condition!
    }

    return false;
}

Который реализует (странную) логику «если скрипт имеет зависимости, он новее, чем кэшированный скрипт (и его необходимо перекомпилировать)». Это не то, что должен делать код; это должно быть решено по времени модификации.

В более новых версиях GroovyScriptEngine это было исправлено (произошли значительные изменения в логике), но сейчас вам нужно создать подкласс GroovyScriptEngine и перезаписать isSourceNewer(ScriptCacheEntry) чтобы исправить логику самостоятельно.


Редактировать: ошибка была сообщена и исправлена ​​ в Groovy 1.7.6. - Попробуйте использовать Groovy 1.7.6 в папке Grails lib .

1 голос
/ 06 декабря 2010

Решение (хак), которое я использовал, наконец, состояло в том, чтобы вывести переменную scriptCache с помощью xstream, прочитать ее и установить в объекте

0 голосов
/ 05 декабря 2010

Не уверен, поможет ли это вам, но вы можете изменить поведение GroovyScriptEngine с помощью CompilerConfiguration (см. GroovyScriptEngine. setConfig ). Существует опция CompilerConfiguration. setRecompileGroovySource , которая может использоваться для установки того, будут ли исходные файлы перезагружаться и перекомпилироваться в случае их изменения. Вы можете прочитать больше о CompilerConfiguration здесь (стр. 282).

...