gradle - 在 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
,那么在评估它时我该怎么做?
解决方案
对于大多数用例,一旦您在任务或插件的其他内部部分中解决了属性值,只需验证属性值就足够了。实际上只有少数扩展被设计为供其他插件或构建脚本使用。
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
,您可以将 替换map
为flatMap
。
推荐阅读
- python - 通过python插入时让SQL时间戳数据?
- windows - msbuild pack 指定版本?
- android - 关于 Android 的 Cordova 构建过程的一些问题
- automation - Freshdesk:自动化“评分”电子邮件
- xpages - 如何在链接标签字段中输入回车
- android - 如何更改 SwitchPreference 的 fontFamily 和 textSize?
- java - 从过滤器迁移到拦截器会导致 403 错误
- r - 一种更有效的填充矩阵的方法
- java - Api Call 在 Postman 中工作,但在 Java 中使用 OKHTTP(返回 ec:400)
- c# - 添加相机视图后绘制的对象丢失