Есть два момента, которые необходимо учитывать: привязка сценария и способ объявления цели.
Сначала идет привязка. Скрипт Groovy немного отличается от класса Groovy / Java. Groovy-скрипты допускают несвязанные переменные. То есть, когда вы компилируете скрипт, переменную не нужно объявлять. Когда компилятор видит одну из этих необъявленных ссылок на переменные, он преобразует ссылку на переменную под обложками в вызове binding.getVariable (имя переменной) (или что-то подобное). Таким образом, последняя строка сценария функционально эквивалентна
setDefaultTarget(binding.getVariable('dist'))
Второе - это объявление цели. Когда цель объявлена, компилятор Groovy фактически видит вызов метода: target (аргументы Map, Closure closure) (или около того). Когда этот метод выполняется, он проверяет аргументы, извлекает имя цели и сохраняет некоторую завернутую ссылку на замыкание по этому имени в привязке. Приближение будет ..
target(Map args, Closure closure) {
binding.setVarialbe(
args.keySet().iterator().next(),
gantClosureWrapping(args, closure))
}
Конечно, приведенный выше код является приблизительным, а не реальным кодом Ганта.
так по сути ...
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')