He leído cómo simplemente importar un archivo maravilloso en otro script maravilloso
Quiero definir funciones comunes en un archivo maravilloso y llamar a esas funciones desde otros archivos maravillosos.
Entiendo que esto sería usar Groovy como un lenguaje de secuencias de comandos, es decir, no necesito clases / objetos. Estoy intentando algo como dsl que se puede hacer en groovy. Todas las variables se afirmarán desde Java y quiero ejecutar un script maravilloso en un shell.
¿Es esto posible en absoluto? ¿Alguien puede dar algún ejemplo?
Respuestas:
Pon eso en la parte superior de tu guión. Eso traerá el contenido de un archivo maravilloso (simplemente reemplace el nombre del archivo entre las comillas dobles con su script maravilloso).
Hago esto con una clase sorprendentemente llamada "Tools.groovy".
fuente
A partir de Groovy 2.2, es posible declarar una clase de script base con la nueva
@BaseScript
anotación de transformación AST.Ejemplo:
archivo MainScript.groovy :
archivo test.groovy :
fuente
Otra forma de hacer esto es definir las funciones en una clase maravillosa y analizar y agregar el archivo a la ruta de clases en tiempo de ejecución:
fuente
GroovyObject
explícitamente, no es un marcador de posición para su propio nombre de clase.Creo que la mejor opción es organizar las cosas de utilidad en forma de clases maravillosas, agregarlas a classpath y dejar que el script principal se refiera a ellas mediante la palabra clave de importación.
Ejemplo:
scripts / DbUtils.groovy
scripts / script1.groovy:
secuencia de comandos en ejecución:
fuente
lib
ysrc
directoriosLa forma en que hago esto es con
GroovyShell
.fuente
Groovy no tiene una palabra clave de importación como los lenguajes de scripting típicos que harán una inclusión literal del contenido de otro archivo (aludido aquí: ¿Groovy proporciona un mecanismo de inclusión? ).
Debido a su naturaleza orientada a objetos / clases, tienes que "jugar" para que cosas como esta funcionen. Una posibilidad es hacer que todas sus funciones de utilidad sean estáticas (ya que dijo que no usan objetos) y luego realizar una importación estática en el contexto de su shell de ejecución. Entonces puede llamar a estos métodos como "funciones globales".
Otra posibilidad sería utilizar un objeto Binding ( http://groovy.codehaus.org/api/groovy/lang/Binding.html) mientras crea su Shell y vincula todas las funciones que desea a los métodos (la desventaja aquí sería tener que enumerar todos los métodos en el enlace, pero tal vez podría usar la reflexión). Otra solución más sería anular
methodMissing(...)
el objeto delegado asignado a su shell, lo que le permite básicamente realizar un envío dinámico utilizando un mapa o cualquier método que desee.Varios de estos métodos se muestran aquí: http://www.nextinstruction.com/blog/2012/01/08/creating-dsls-with-groovy/ . Avísame si quieres ver un ejemplo de una técnica en particular.
fuente
¿Qué tal tratar el script externo como una clase Java? Basado en este artículo: https://www.jmdawson.net/blog/2014/08/18/using-functions-from-one-groovy-script-in-another/
getThing.groovy El script externo
printThing.groovy El guión principal
Resultado
fuente
Aquí hay un ejemplo completo de cómo incluir un script dentro de otro.
Simplemente ejecute el archivo Testmain.groovy
Comentarios explicativos incluidos porque soy bueno así;]
Testutils.groovy
Testmain.groovy
fuente
Para los recién llegados, parece que groovy ahora admite el
:load file-path
comando que simplemente redirige la entrada del archivo dado, por lo que ahora es trivial incluir scripts de biblioteca.Funciona como entrada al groovysh y como una línea en un archivo cargado:
groovy:000> :load file1.groovy
file1.groovy puede contener:
:load path/to/another/file invoke_fn_from_file();
fuente
:load file-path
?groovy:000> :load file1.groovy
file1.groovy puede contener: <br/>:load path/to/another/file
Una combinación de respuestas de @grahamparks y @snowindy con un par de modificaciones es lo que funcionó para mis scripts Groovy que se ejecutan en Tomcat:
Utils.groovy
MyScript.groovy:
fuente
Groovy puede importar otras clases maravillosas exactamente como lo hace Java. Solo asegúrese de que la extensión del archivo de la biblioteca sea .groovy.
fuente
Después de algunas investigaciones, he llegado a la conclusión de que el siguiente enfoque parece el mejor.
algunos / subpackage / Util.groovy
ejemplo.groovy
Para ejecutar el
example.groovy
script, agréguelo a la ruta de su sistema y escriba desde cualquier directorio:El guión imprime:
El ejemplo anterior se probó en el siguiente entorno:
Groovy Version: 2.4.13 JVM: 1.8.0_151 Vendor: Oracle Corporation OS: Linux
El ejemplo demuestra lo siguiente:
Util
clase dentro de un guión maravilloso.Util
clase que llama a laGuava
biblioteca de terceros incluyéndola como unaGrape
dependencia (@Grab('com.google.guava:guava:23.0')
).Util
clase puede residir en un subdirectorio.Util
clase.Comentarios / sugerencias adicionales:
new Util()
, pero lo más importante, tendría que colocarse en un archivo llamado cualquier cosa menos Util.groovy. Consulte Scripts versus clases para obtener más detalles sobre las diferencias entre los scripts maravillosos y las clases maravillosas."${new File(getClass().protectionDomain.codeSource.location.path).parent}/some/subpackage/Util.groovy"
lugar de"some/subpackage/Util.groovy"
. Esto garantizará que elUtil.groovy
archivo siempre se encontrará en relación con la ubicación del script maravilloso (example.groovy
) y no con el directorio de trabajo actual. Por ejemplo, usar"some/subpackage/Util.groovy"
daría como resultado una búsqueda enWORK_DIR/some/subpackage/Util.groovy
.myScript.groovy
es un nombre de script yMyClass.groovy
es un nombre de clase. La asignación de nombresmy-script.groovy
dará lugar a errores de tiempo de ejecución en determinados escenarios porque la clase resultante no tendrá un nombre de clase Java válido.fuente