Wie ist Gant durch ihre Namen Referenzziele können und nicht eine fehlende Eigenschaft Ausnahme erhalten?

StackOverflow https://stackoverflow.com/questions/2231972

Frage

Im Code präsentiert sich hier: Gant Datei gibt es den folgenden Code:

target(dist: 'Create release artefacts') {
        depends(test)
        depends(jar)
}
target(run: 'Run the distributed jar') {
        depends(dist)
        Ant.java(jar: distributedJarPath, fork: 'true')
}

target(hello: 'Hello World') {
        println("Hello World")
}

setDefaultTarget(dist)

Ich bin daran interessiert, wie es in der Lage zu schreiben setDefaultTarget(dist) und erhalte keine Ausnahme über dist als fehlende Eigenschaft. Ist das Snippet im Kontext eines Objekts ausgewertet und die Ziele erstellen Instanzvariablen?

War es hilfreich?

Lösung

Es gibt zwei Elemente, die Sie benötigen, um die Bindung des Skripts zu betrachten, und wie ein Ziel deklariert wird.

Da ist zunächst die Bindung. Ein starkes Skript ist ein bisschen anders aus einer Groovy / Java-Klasse. Groovy-Skripte erlauben für ungebundene Variablen. Bedeutung, wenn Sie das Skript die Variable muss nicht kompilieren deklariert werden. Wenn der Compiler eine dieser nicht angemeldeten Variablenreferenzen sieht, wird es die refrence auf die Variable unter der Decke zu einem Aufruf von binding.getVariable (Variablenname) (oder etwas darum herum) zu konvertieren. So ist die letzte Zeile des Skripts ist funktionell equivilant zu

setDefaultTarget(binding.getVariable('dist'))

Zweitens wird die die Erklärung des Ziels. Wenn das Ziel der Groovy-Compiler deklariert wird, ist eigentlich ein Methodenaufruf zu sehen: Ziel (Karte args, Schließung Schließung) (oder in diesem Bereich). Wenn dieses Verfahren ausführt, prüft er die args, extrahiert den Namen des Ziels, und speichert die Schließung einige verpackte Referenz durch diesen Namen in der Bindung. Ein appropximation wäre ..

target(Map args, Closure closure) {
  binding.setVarialbe( 
    args.keySet().iterator().next(),
    gantClosureWrapping(args, closure))
}

Natürlich ist der obige Code ist eine Annäherung und nicht der wirkliche gant-Code.

so im Wesentlichen ...

target(dist: 'doc') { ... }
// the above adds 'dist' as a variable to the binding

//...

setDefaultTarget(dist)
// dist is unbound, so it is replaced with binding.getVariable('dist')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top