在 Gradle 中,您如何执行惰性评估属性的验证(在扩展上)?

In Gradle, how do you perform validation of lazily evaluated properties (on extensions)?

有没有办法在计算 属性 时验证 属性 值?我不能在 getter 中执行此操作,因为 returns 属性 对象 - 我希望仅在计算实际值时对 运行 进行验证(即我想懒惰评估友好)。

他们在此处显示使用 属性 对象的扩展:

但是,他们没有解释在计算值时如何进行 属性 验证。这是 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,那么在求值时我该怎么做?

对于大多数用例,一旦您在任务中或插件的其他内部部分解决了 属性 值,只需验证它就足够了。实际上只有少数扩展被设计为由其他插件或构建脚本使用。

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 的支持字段,在解析时运行验证。如果您不想抛出异常,而只是 return 一个空的 Provider,您可以将 map 替换为 flatMap