¿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?

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

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?

¿Fue útil?

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')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top