2014-02-11 13 views
25
ext { 
    springVersion = "3.1.0.RELEASE" 
    emailNotification = "[email protected]" 
} 

Above-Code ist der Ausschnitt aus build.gradleext und Bedeutung der Codeblock in der gradle Datei

ich diesen Anruf ext Methode verstehen mit {} Schließung Parameter. ist es richtig? Also denke ich, dass gradle auf springVersion und emailNotification zugreift. Ich werde meine Vermutung bestätigt mit folgendem Code

def ext(data) { 
    println data.springVersion 
} 

ext { 
    springVersion = "3.1.0.RELEASE" 
    emailNotification = "[email protected]" 
} 

aber führt, dass Code unten einen Fehler aufgetreten.

groovy.lang.MissingPropertyException: No such property: springVersion for class: Test 

erklären Sie ext und Codeblock speziell?

+0

Wie werden Sie die Methode ext() aufrufen? Könnten Sie bitte die vollständige Gradle-Datei einfügen? –

Antwort

37

ext ist eine Abkürzung für project.ext und wird verwendet, zusätzliche Eigenschaften für die project Objekt zu definieren. (Es ist auch möglich, zusätzliche Eigenschaften für viele andere Objekte zu definieren.) Beim Lesen einer zusätzlichen Eigenschaft wird ext. weggelassen (z. B. println project.springVersion oder println springVersion). Das Gleiche funktioniert innerhalb von Methoden. Es ist nicht sinnvoll, eine Methode mit dem Namen ext zu deklarieren.

+0

Hallo, Peter.Hast du welche Grammatik in Groovy involviert? Oder ist es nur in der Grammatik? @Peter Niederwieser – wanglugao

+0

Vielen Dank @Peter –

3

Hier ist die Erklärung dafür, warum der Beispielcode in der Frage einen Fehler verursacht.

Im Code:

ext { 
    springVersion = "3.1.0.RELEASE" 
    emailNotification = "[email protected]" 
} 

nicht passieren auf die Funktion "ext" ein Objekt, das die springVersion und emailNotification Eigenschaften hat. Die geschweiften Klammern bedeuten kein POJO, sondern einen Verschluss. Aus diesem Grund beschwert sich die "ext" -Funktion, dass sie nicht zu den Eigenschaften gelangen kann.

Die Idee mit dem Führen eines solchen Verschlusses, als Konfigurationsverschluss bekannt ist, dass die Empfangsfunktion:

  1. Ändern der Delegierten-Eigenschaft des Verschlusses auf ein Objekt hinweisen, dass die Verschlusseigenschaften/methods sollte handeln.

  2. führen den Verschluss()

Damit der Verschluss führt, und wenn sie sich auf Verfahren/Eigenschaften bezieht, wird diese ausgeführt werden, auf das Objekt konfiguriert werden.

Somit ist die folgende Änderung an Ihrem Code wird es funktioniert:

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]" 
} 

Hoffnung, das hilft. Groovy Verschlüsse bekommen etwas gewöhnungsbedürftig ...

0

Es ist das Überschreiben von get() und set() von ExtraPropertiesExtension, das ist der Schlüssel, um die Konfigurationssyntax für nie zuvor definierte Eigenschaften zu arbeiten.

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 

Siehe ExtraPropertiesExtension docs