首页 > 解决方案 > 在 Gradle 中,如何对延迟评估的属性进行验证(在扩展上)?

问题描述

有没有办法在评估属性时验证属性值?我不能在 getter 中执行此操作,因为它返回 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,那么在评估它时我该怎么做?

标签: gradlepropertieslazy-evaluation

解决方案


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

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()

我将 a 变成了在解决时运行验证Property的支持字段。Provider如果您不想抛出异常,而只是返回一个空的Provider,您可以将 替换mapflatMap


推荐阅读