Объект соглашения Groovy DSL «Не удалось получить неизвестное свойство»
В моем build.gradle есть следующий код:
class GreetingPlugin implements Plugin<Project> {
def void apply(Project project) {
project.convention.plugins.greeting = new GreetingPluginConvention()
project.task('hello') {
doLast {
println project.convention.plugins.greeting.message
}
}
}
}
class GreetingPluginConvention {
String message
def greet(Closure closure) {
closure.delegate = this
closure()
}
}
apply plugin: GreetingPlugin
greet {
message = 'Hi from Gradle'
}
Он отлично работает -
./gradlew hello
печатает «Привет от Gradle», что и ожидалось.
Однако, используя переменную
greet
в сценарии (например,
println greet
) выдает сообщение «Не удалось получить неизвестное свойство 'greet' для проекта ':app' типа org.gradle.api.Project.»
Мой вопрос - как переменная greet обнаруживается при вызове против закрытия, но не обнаруживается при использовании в качестве обычной переменной. Какая магия Groovy / Gradle творится за кулисами?
1 ответ
Когда он называется закрытием,
greet {
message = 'Hi from Gradle'
}
вы фактически добавляете дополнительный код к исходному блоку / закрытию приветствия, определенному в GreetingPluginConvention, это не переменная, поэтому пытается обработать его как такую неудачу. Думайте об этих закрытии блоков как о удобном способе установки или настройки ваших плагинов.
Скрипты Gradle немного отличаются от обычного линейного скрипта.