Vous devez prendre en compte deux éléments, la liaison du script et la manière dont une cible est déclarée.
D'abord il y a la liaison. Un script Groovy est un peu différent d'une classe Groovy/Java. Les scripts groovy permettent des variables non liées. Signification lorsque vous compilez le script, la variable n'a pas besoin d'être déclarée. Lorsque le compilateur voit l'une de ces références de variables non déclarées, il convertit la réfrence à la variable sous les couvertures en un appel à binding.getVariable (nom de la variable) (ou quelque chose autour). Ainsi, la dernière ligne du script est fonctionnellement équivalente à
setDefaultTarget(binding.getVariable('dist'))
Ensuite, il ya la déclaration de la cible. Lorsque la cible est déclarée, le compilateur Groovy voit effectivement un appel de méthode: target (Arguments de la carte, Fermeture de la fermeture) (ou à peu près). Lorsque cette méthode s'exécute, elle examine les arguments, extrait le nom de la cible et stocke une référence enveloppée à la fermeture par ce nom dans la liaison. Une 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 le vrai code de 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')