¿Cómo es capaz de hacer referencia a las piezas por sus nombres, y no conseguir una excepción de la propiedad que falta Gant?
-
19-09-2019 - |
Pregunta
En el código presentado aquí: Gant archivo , existe el siguiente código:
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)
Me interesa la forma en que es capaz de escribir setDefaultTarget(dist)
, y no recibir una excepción sobre dist
como una propiedad que falta. Se evalúa este fragmento en el contexto de un objeto y los objetivos de crear variables de instancia?
Solución
Hay dos elementos que hay que considerar, la unión de la secuencia de comandos, y cómo se declara un objetivo.
En primer lugar está la unión. Un script Groovy es un poco diferente de una clase maravillosa / Java. guiones maravillosos permiten para las variables no unidos. Es decir, cuando se compila el script de la variable no es necesario declarar. Cuando el compilador ve una de estas referencias a variables no declaradas, que convertirá el refrence a la variable bajo las sábanas a una llamada a binding.getVariable (nombre variable) (o algo alrededor de la misma). Así que la última línea del script es funcionalmente equivilant a
setDefaultTarget(binding.getVariable('dist'))
En segundo lugar está el es la declaración del objetivo. Cuando se declara el objetivo del compilador maravilloso está viendo realmente una llamada de método: objetivo (args Mapa, cierre Cierre) (o alrededor del mismo). Cuando este método se ejecuta examina los args, extrae el nombre del destino, y almacena alguna referencia envuelto al cierre por ese nombre en la unión. Un appropximation sería ..
target(Map args, Closure closure) {
binding.setVarialbe(
args.keySet().iterator().next(),
gantClosureWrapping(args, closure))
}
Por supuesto, el código anterior es una aproximación y no el código Gant real.
lo que en esencia ...
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')