Я пытаюсь изучить Gradle. Мой предпочтительный стиль обучения заключается в том, чтобы понять на низком уровне, что происходит. С этой целью я пытаюсь понять, что происходит в пример 6.1 документации по отношению к Ссылка DSL:
task hello {
doLast {
println 'Hello world!'
}
}
Я понимаю, что этот script выполняется в контексте Project
. Поэтому из документации Project
видно, что существует несколько перегруженных методов task(...)
. Глядя на подписи, мне нужно выбрать тот, у кого есть закрытие в качестве последнего аргумента. И поскольку мы не передаем Map
здесь, я предполагаю, что метод, который вызывается, task(String name, Closure closure)
.
Однако часть, с которой я борюсь, состоит в том, как в script литеральная строка hello
отображается на String
.
Другим примером является пример 6.7:
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
Здесь я предполагаю, что мы вызываем форму task(Map<String, ?> args, String name)
метода. Но,
- Опять же, как буквальная строка
taskX
заканчивается какString
? - Учитывая, что круглые скобки не используются для построения литерала
Map
, как часть в скобках заканчиваетсяMap
? - Если я правильно понял, какой метод вызывается, не являются ли аргументы, приведенные в неправильном порядке в script, по сравнению с документацией DSL?
- Синтаксис с использованием круглых скобок ищет весь мир, как вызов метода. Это может указывать на делегирование объекта
Project
для разрешенияtaskX
как неизвестного метода. Но, AFAIK, вызов метода не был бы синтаксически действительным в этот момент, если бы метод вызывалtask
, непосредственно предшествующий ему.
Как вы можете видеть, я немного смущен тем, как пример синтаксиса сопоставляется с справочным руководством DSL, что делает его немного сложным для меня, чтобы понять, что происходит на низовом уровне.
Спасибо!