variable test deploy dependency buildscript groovy gradle

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:

  1. 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.

  2. 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

Ver documentos ExtraPropertiesExtension


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 .