在 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
。
有没有办法在计算 属性 时验证 属性 值?我不能在 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
。