Объект соглашения 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 немного отличаются от обычного линейного скрипта.

Другие вопросы по тегам