groovy - deploy - gradle test
Significado del bloque de extensión y código en el archivo gradle (3)
Aquí está la explicación de por qué el código de muestra en la pregunta produce un error.
En el código:
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
No pasa a la función "ext" un objeto que tiene las propiedades springVersion y emailNotification. Las llaves no significan un POJO sino un cierre. Esta es la razón por la cual la función "ext" se queja de que no puede llegar a las propiedades.
La idea de pasar tal cierre, conocido como cierre de configuración, es que la función receptora:
Modifique la propiedad de delegado del cierre para que apunte a un objeto sobre el que deberían actuar las propiedades / métodos de cierre.
ejecutar el cierre ()
Por lo tanto, el cierre se ejecuta y cuando se refiere a los métodos / propiedades, estos se ejecutarán en el objeto que se configurará.
Por lo tanto, la siguiente modificación de su código lo hará funcionar:
class DataObject {
String springVersion;
String emailNotification;
}
def ext(closure) {
def data = new DataObject() // This is the object to configure.
closure.delegate = data;
// need this resolve strategy for properties or they just get
// created in the closure instead of being delegated to the object
// to be configured. For methods you don''t need this as the default
// strategy is usually fine.
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure() // execute the configuration closure
println data.springVersion
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Espero que esto ayude Los cierres Groovy tardan en acostumbrarse ...
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
El código anterior es el fragmento de build.gradle
Entiendo ese método call ext con {} parámetro de cierre. ¿es lo correcto? Así que creo que Gradle está accediendo a springVersion y emailNotification. Voy a verificar mi suposición con el siguiente código
def ext(data) {
println data.springVersion
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
pero ejecuta ese código debajo de Error.
groovy.lang.MissingPropertyException: No such property: springVersion for class: Test
¿Explicas el bloque de extensión y código específicamente?
Es la anulación de get () y set () por ExtraPropertiesExtension
la clave para hacer que la sintaxis de configuración para propiedades definidas nunca antes funcione.
class DataObject {
HashMap<String, Object> props = new HashMap<String, Object>()
Object get(String name) {
return props.get(name)
}
void set(String name, @Nullable Object value) {
props.put(name, value)
}
}
def myExtInstance = new DataObject()
def myExt = { Closure closure ->
def data = myExtInstance
closure.delegate = data;
// need this resolve strategy for properties or they just get
// created in the closure instead of being delegated to the object
// to be configured. For methods you don''t need this as the default
// strategy is usually fine.
closure.resolveStrategy = Closure.DELEGATE_FIRST
closure() // execute the configuration closure
println data.springVersion
}
myExt {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
println "myExtInstance.springVersion" + myExtInstance.springVersion
ext
es una abreviatura de project.ext
, y se usa para definir propiedades adicionales para el objeto del project
. (También es posible definir propiedades adicionales para muchos otros objetos). Al leer una propiedad adicional, ext.
se omite (por ejemplo, println project.springVersion
o println springVersion
). Lo mismo funciona desde dentro de los métodos. No tiene sentido declarar un método llamado ext
.