Почему я не могу присвоить значение свойству gradle в расширении?

#gradle #gradle-plugin

#gradle #gradle-плагин

Вопрос:

Я создаю пользовательский плагин gradle в gradle 5.4. У меня есть расширение:

 public class ExternalResourcesPluginExtension {

    public final Property<Boolean> update;

    public ExternalResourcesPluginExtension(final Project project) {
        this.project = project;
        update = project.getObjects().property(Boolean.class).convention(false);
    }
}
  

Которое я применяю к плагину:

 final ExternalResourcesPluginExtension extension = project.getExtensions()
        .create(EXTENSION_NAME, ExternalResourcesPluginExtension.class, project);
  

Но затем, когда я пытаюсь присвоить ему значение, как во всех примерах:

 externalResources {
    update = false
}
  

Затем происходит сбой с:

Не удается привести объект ‘false’ к классу ‘java.lang.Логическое значение’ для класса ‘org.gradle.api.provider.Свойство’

Если я изменю его на:

 externalResources {
    update.set(false)
}
  

Тогда это работает нормально.

Что происходит? Почему я не могу присвоить своему свойству, как в примерах?

Комментарии:

1. У вас есть объявление update поля с типом Property<Boolean> (а не логическое значение напрямую) , поэтому вы не можете присвоить логическое значение этому полю directry (исключение приведения класса) : вам нужно использовать методы, предоставляемые Property интерфейсом (см. docs.gradle.org/current/javadoc/org/gradle/api/provider /… ) , например update.set(false)

2. не могли бы вы предоставить ссылку на примеры из документов Gradle, где значение присваивается Property без использования выделенного метода установки?

3. @M.Ricciuti Смотрите Отложенную конфигурацию , где указано «Обратите внимание, что оператор присваивания может использоваться вместо вызова Property.set()».

4. Хорошо, я пропустил этот момент в документации, но см. Примечание в конце этой главы «Отложенная конфигурация»: Note that Gradle Groovy DSL will generate setter methods for each Property-typed property in a task implementation. These setter methods allow you to configure the property using the assignment (=) operator as a convenience. => похоже, что использование присваивания = operator доступно только в реализации задачи. Я предполагаю, что эти удобные методы настройки не создаются для реализации расширения.

5. @M.Ricciuti Верно, значит, я предполагаю, что документация неверна? Второй пример настраивается greeting для messages расширения. Если вы сделаете свой комментарий ответом, я приму его.