Comment est en mesure de faire référence Gant cibles par leurs noms, et non d'obtenir une exception de la propriété manquante?

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

Question

Dans le code présenté ici: fichier Gant, il y a le code suivant:

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)

Je suis intéressé par la façon dont il est capable d'écrire setDefaultTarget(dist), et non recevoir une exception au sujet dist comme une propriété manquante. Est-ce extrait évalué dans le contexte d'un objet, et les cibles créer des variables d'instance?

Était-ce utile?

La solution

Il y a que vous devez considérer deux éléments, la liaison du script, et comment une cible est déclarée.

Tout d'abord, il y a la liaison. Un script Groovy est un peu différent d'une classe Groovy / Java. scripts Groovy permettent des variables non liées. Signification lorsque vous compilez le script ne doit pas être la variable déclarée. Lorsque le compilateur voit une de ces références variables non déclarées, il convertit le refrence à la variable sous les couvertures à un appel à binding.getVariable (nom variable) (ou quelque chose enuiron). Ainsi, la dernière ligne du script est fonctionnellement equivilant à

setDefaultTarget(binding.getVariable('dist'))

Deuxièmement, il est est la déclaration de la cible. Lorsque la cible est déclaré le compilateur Groovy voit en fait un appel de méthode: cible (Carte args, fermeture de fermeture) (ou à peu près). Lorsque cette méthode exécute examine les args, extrait le nom de la cible, et stocke une référence enveloppé à la fermeture de ce nom dans la liaison. Un appropximation serait ..

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

Bien sûr, le code ci-dessus est une approximation et non pas le code gant.

donc, en substance ...

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')
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top