Как в Gradle вы выполняете проверку лениво оцениваемых свойств (в расширениях)? - PullRequest
0 голосов
/ 19 июня 2020

Есть ли способ проверить значение свойства при его оценке? Я не могу сделать это в геттере, потому что он возвращает объект Property - я хочу, чтобы проверка выполнялась только тогда, когда фактическое значение вычислено (т.е. я хочу быть ленивым для оценки).

Они показывают расширения, использующие объект Property здесь:

Однако они не объясняют, как выполнять проверку свойства при вычислении значения. Вот фрагмент кода из приведенного в документации Gradle примера:

// A project extension
class MessageExtension {
    // A configurable greeting
    final Property<String> greeting

    @javax.inject.Inject
    MessageExtension(ObjectFactory objects) {
        greeting = objects.property(String)
    }
}

Если бы я хотел убедиться, что значение greeting не было равно test, то как бы я это сделал, когда он оценивается?

1 Ответ

2 голосов
/ 19 июня 2020

Для большинства случаев использования должно быть достаточно просто проверить значение свойства после того, как вы разрешите его в своей задаче или в других внутренних частях вашего плагина. На самом деле только несколько расширений предназначены для использования другими плагинами или сценарием сборки.

Gradle не предоставляет некоторую проверку, которую можно прикрепить к свойству, однако вы можете создать эту функциональность самостоятельно, как в пример ниже:

class MessageExtension {

    private final Property<String> _greeting

    final Provider<String> greeting

    @javax.inject.Inject
    MessageExtension(ObjectFactory objects) {
        _greeting = objects.property(String)
        greeting = _greeting.map { value ->
            if (value.equals('test'))
                throw new RuntimeException('Invalid greeting')
            return value
        }
    }

    def setGreeting(String value) {
        _greeting.set(value)
    }

    def setGreeting(Provider<String> value) {
        _greeting.set(value)
    }
}

project.extensions.create('message', MessageExtension)

message {
    greeting = 'test'
}

println message.greeting.get()

Я превратил Property в поле поддержки для Provider, которое запускает проверку при разрешении. Если вы не хотите генерировать исключение, а просто возвращаете пустой Provider, вы можете заменить map на flatMap.

...