ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Le code ci-dessus est l'extrait de build.gradle
Je comprends cette méthode d'appel ext avec le paramètre de fermeture {}. c'est juste? Je pense donc que Gradle accède à SpringVersion et à EmailNotification. Je vais vérifier mon hypothèse avec le code ci-dessous
def ext(data) {
println data.springVersion
}
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
mais exécutez ce code ci-dessous. Une erreur s'est produite.
groovy.lang.MissingPropertyException: No such property: springVersion for class: Test
expliquez-vous spécifiquement le bloc ext et code?
ext
est un raccourci pour project.ext
, et est utilisé pour définir propriétés supplémentaires pour l'objet project
. (Il est également possible de définir des propriétés supplémentaires pour de nombreux autres objets.) Lors de la lecture d'une propriété supplémentaire, le ext.
est omis (par exemple println project.springVersion
ou println springVersion
). La même chose fonctionne à partir des méthodes internes. Cela n'a aucun sens de déclarer une méthode nommée ext
.
Voici pourquoi l'explication de l'exemple de code dans la question produit une erreur.
Dans le code:
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "[email protected]"
}
Ne passe pas à la fonction "ext" un objet qui a les propriétés springVersion et emailNotification. Les accolades ne signifient pas un POJO mais une fermeture. C'est pourquoi la fonction "ext" se plaint qu'elle ne peut pas accéder aux propriétés.
L'idée de passer une telle fermeture, connue sous le nom de fermeture de configuration, est que la fonction de réception:
Modifiez la propriété déléguée de la fermeture pour pointer vers un objet sur lequel les propriétés/méthodes de fermeture doivent agir.
exécuter la fermeture ()
Ainsi, la fermeture s'exécute et lorsqu'elle fait référence à des méthodes/propriétés, celles-ci seront exécutées sur l'objet à configurer.
Ainsi, la modification suivante de votre code le fera fonctionner:
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]"
}
J'espère que cela vous aidera. Les fermetures groovy prennent le temps de s'habituer à ...
C'est le remplacement de get () et set () par ExtraPropertiesExtension
qui est la clé pour faire fonctionner la syntaxe de configuration pour des propriétés jamais définies auparavant.
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