2010-03-02 4 views
18

Каков наилучший способ создать задачу градиента, которая запускает отличный скрипт? Я понимаю, что Gradle строить файлы заводные, так что я думаю, что можно было бы сделать что-то вроде этого:Запуск groovy скрипта изнутри gradle

task run << { 
    Script app = new GroovyShell().parse(new File("examples/foo.groovy")) 
    // or replace .parse() w/ a .evalulate()? 
    app.run() 
} 

Я получаю все виды юродивых ошибок, когда я пытаюсь это, если bar.groovy использует @Grab аннотаций или даже делая простой импорт. Я хочу создать задачу градиента, чтобы обработать это, так что я могу надеюсь, что повторно использовать определение пути к классам.

Было бы лучше переместить примеры в каталог src где-нибудь? Какая практика?

ответ

1

Я думаю, что вы, вероятно, нужно запустить сценарий как новый процесс ... например,

["groovy","examples/foo.groovy"].execute() 

Я предположил бы, что путь Gradle выполняется не с помощью вызова groovy, поэтому установка, что делает @ Работать с захватом никогда не бывает. Это также может быть версия Groovy, которую использует Gradle, не поддерживает @Grab.

+3

В отличие от других предложений здесь, для этого требуется, чтобы пользователь имел независимую установку Groovy , Gradle не предоставляет «groovy», «groovy.bat» и т. Д. Это неприемлемое требование для приложений, созданных с помощью Gradle, потому что gradlew используется для устранения необходимости даже устанавливать систему Gradle независимо. – Blaine

7

Вы можете попробовать использовать GroovyScriptEngine вместо GroovyShell. Я использовал его ранее с аннотациями @Grab. Вам понадобится всякий паз на пути к классам, groovy-all.jar будет недостаточно. Я предполагаю, что Айви не упакован в groovy-all.jar. Нечто подобное должно на хитрость:

Этот сценарий предполагает заводной сценарий на /tmp/HelloWorld.groovy

def pathToFolderOfScript = '/tmp' 
def gse = new GroovyScriptEngine([pathToFolderOfScript] as String[]) 
gse.run('HelloWorld.groovy', new Binding()) 
12

Или вы могли бы сделать:

new GroovyShell().run(file('somePath')) 
Смежные вопросы