Понимание синтаксиса groovy в определении задачи gradle


я новичок в Gradle и Groovy и пытаюсь понять, что происходит на уровне groovy, когда задача gradle определена.

task hello  { 
   println "configuring task hello" 
   doLast {
     println "hello there" 
   }
}

из чтения книги "Gradle In Action" я знаю, что task hello {} - это действительно вызов task() метод заводной Project интерфейс. На странице 77 показано, что существует 4 метода, называемых task на Project интерфейс

task(args: Map<String,?>, name:String)
task(args: Map<String,?>, name:String, c:Closure)
task(name: String)
task(name: String, c:Closure)

я понимаю, что {} тело закрытия.

чего я не понимаю, так это как groovy интерпретирует hello на task hello { } согласно https://stackoverflow.com/a/25592665/438319 существует заводной плагин компилятора, который преобразует task hello { } на task('hello', { })

Мои Вопросы:

  • где я могу найти информацию о плагине компилятора Gradle Groovy, который выполняет преобразование?

  • это утверждение, что Скрипты Gradle являются заводными программами технически неверно, так как gradle каким-то образом расширяет язык программирования Groovy?

  • есть ли способ получить gradle команда для печати базового кода groovy, который генерируется после запуска плагина компилятора?

1 65

1 ответ:

Gradle использует АСТ преобразований для расширения синтаксиса Groovy. Синтаксис определения задачи, который вы упоминаете, является лишь одним из преобразований, применяемых Gradle. Вы можете найти реализацию для этого преобразования здесь. Чтобы ответить на ваши конкретные вопросы:

  • отдельные преобразования, которые применяет Gradle, специально не документированы нигде, о чем я знаю. Однако вы можете посмотреть на другие классы в том же пакете ссылка выше.

  • Gradle скрипты поддерживают супер-набор Заводной синтаксис. Любой допустимый Groovy также допустим в сценарии Gradle, однако сценарий Gradle не обязательно (и обычно не) допустим "по умолчанию" Groovy.

  • нет способа получить вывод эквивалентного кода Groovy, так как это фактическое абстрактное синтаксическое дерево, которое обрабатывается в памяти.