Tengo un script de compilación de Gradle ( build.gradle
), en el que creé algunas tareas. Estas tareas consisten principalmente en llamadas a métodos. Los métodos llamados también están en el script de construcción.
Ahora, aquí está la situación:
Estoy creando una buena cantidad de scripts de compilación, que contienen diferentes tareas, pero utilizan los mismos métodos del script original. Por lo tanto, me gustaría extraer estos "métodos comunes" de alguna manera, para poder reutilizarlos fácilmente en lugar de copiarlos para cada nuevo script que cree.
Si Gradle fuera PHP, algo como lo siguiente sería ideal:
//script content
...
require("common-methods.gradle");
...
//more script content
Pero, por supuesto, eso no es posible. ¿O es eso?
De todos modos, ¿cómo puedo lograr este resultado? ¿Cuál es el mejor método posible para hacer esto? Ya leí la documentación de Gradle, pero parece que no puedo determinar qué método será el más fácil y el más adecuado para esto.
¡Gracias por adelantado!
ACTUALIZAR:
Logré extraer los métodos en otro archivo.
(utilizando apply from: 'common-methods.gradle'
),
entonces la estructura es la siguiente:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
Después de ejecutar una tarea de build.gradle
, me encontré con un nuevo problema: aparentemente, los métodos no se reconocen cuando están encommon-methods.gradle
.
¿Algunas ideas de como reparar esto?
fuente
timestamp()
ocurrentWorkingDirectory()
métodos comotask
-s (por ejemplo). Las funciones de utilidad y cosas similares son nominalmente escalares: no serían tareas excepto que existen limitaciones en la reutilización de código incorporada con Gradle y la mayoría de los sistemas de compilación. Me gusta el mundo DRY donde puedo hacer una cosa UNA vez y reutilizarla. De hecho, extendiendo el ejemplo de @Pieter VDE, también uso unroot.gradle
patrón " " para mi proyecto principal: el archivo build.gradle generalmente define algunos detalles del proyecto y luego soloapply ${ROOT}
...Respuestas:
No es posible compartir métodos, pero puede compartir propiedades adicionales que contengan un cierre, que se reduce a lo mismo. Por ejemplo, declare
ext.foo = { ... }
incommon-methods.gradle
, useapply from:
para aplicar el script y luego llame al cierre confoo()
.fuente
File foo(String f)
se convertiráext.foo = { f -> ... }
, ¿puedo hacer algo comoFile f = foo(...)
:?Construyendo sobre la respuesta de Peter , así es como exporto mis métodos:
Contenido de
helpers/common-methods.gradle
:// Define methods as usual def commonMethod1(param) { return true } def commonMethod2(param) { return true } // Export methods by turning them into closures ext { commonMethod1 = this.&commonMethod1 otherNameForMethod2 = this.&commonMethod2 }
Y así es como uso esos métodos en otro script:
// Use double-quotes, otherwise $ won't work apply from: "$rootDir/helpers/common-methods.gradle" // You can also use URLs //apply from: "https://bitbucket.org/mb/build_scripts/raw/master/common-methods.gradle" task myBuildTask { def myVar = commonMethod1("parameter1") otherNameForMethod2(myVar) }
Aquí encontrará más información sobre la conversión de métodos a cierres en Groovy.
fuente
ext
.Usando el dsl de Kotlin funciona así:
build.gradle.kts :
external.gradle.kts :
fuente
Otro enfoque para Kotlin DSL podría ser:
my-plugin.gradle.kts
settings.gradle.kts
fuente