2010-03-02 26 views
18

¿Cuál es la mejor manera de crear una tarea gradle, que ejecuta una secuencia de comandos groovy? Soy consciente de que Gradle construir archivos son maravilloso, así que yo creo que sería posible hacer algo como esto:Ejecutar script groovy desde dentro de gradle

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

consigo todo tipo de errores whacky cuando intento esto si bar.groovy está utilizando anotaciones o @Grab incluso haciendo importaciones simples. Quiero crear una tarea de gradle para manejar esto, de modo que pueda con suerte reutilizar la definición de classpath.

¿Sería mejor mover el directorio ejemplos en el directorio src? ¿Cuál es una mejor práctica?

Respuesta

1

Creo que es probable que tenga que ejecutar el script como un nuevo proceso ... por ejemplo,

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

yo supongo que la forma en que se ejecuta Gradle no es a través de la invocación de groovy, por lo que la configuración que hace @ El trabajo de agarre nunca ocurre. También podría ser la versión de Groovy que utiliza Gradle que no admite @Grab.

+3

A diferencia de las otras sugerencias aquí, esta requiere que el usuario tenga una instalación independiente de Groovy . Gradle no proporciona "groovy", "groovy.bat", etc. Es un requisito inaceptable para las aplicaciones creadas con Gradle, ya que gradlew se usa para eliminar la necesidad de tener incluso el sistema Gradle instalado de forma independiente. – Blaine

7

Puede intentar usar GroovyScriptEngine en lugar de GroovyShell. Lo he usado previamente con anotaciones @Grab. Necesitarás todo groovy en el classpath, el groovy-all.jar no será suficiente. Supongo que Ivy no está empaquetada en groovy-all.jar. Algo así debe al truco:

Este script presupone un guión maravilloso en /tmp/HelloWorld.groovy

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

o usted podría hacer:

new GroovyShell().run(file('somePath')) 
Cuestiones relacionadas