Подтвердить что ты не робот

Как интерпретировать Gradle DSL

Я пытаюсь изучить 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, что делает его немного сложным для меня, чтобы понять, что происходит на низовом уровне.

Спасибо!

4b9b3361

Ответ 1

Вариант синтаксиса объявления task foo отличается тем, что он реализован с использованием плагина компилятора Groovy. Насколько я знаю, это единственный случай, когда плагин компилятора используется для поддержки специального синтаксиса.