我想实现一件非常基本的事情(在任何正常语言中(:我想获得Property的默认值(约定(。Gradle文档在懒惰配置一章中描述了如何将约定应用于属性:
def property = objects.property(String)
// Set a convention
property.convention("convention 1")
println("value = " + property.get())
// Can replace the convention
property.convention("convention 2")
println("value = " + property.get())
property.set("value")
// Once a value is set, the convention is ignored
property.convention("ignored convention")
println("value = " + property.get())
问题是,在设置值时,无法查询property
以获取约定(默认值(的信息。似乎唯一能清除(无效(值的方法是:
property.value(null).get()
但这只是愚蠢的,因为你在做不必要的行动,而大会就在那里?
有人知道如何在不清除价值的情况下获得它吗?
(对于2022(的答案是:不,您无法获得属性的默认值(约定(。
我将尝试回答为什么set
在调用convention
后会覆盖它。convention
是默认值,一旦通过调用set
使属性具有值,就会忽略convention
,因为该属性具有值。这是有道理的,因为这就是默认值的含义。如果我有一个值,请使用,否则使用此默认值。CCD_ 7和CCD_。我不太明白为什么你想使用gradle会感到惊讶,但作为一个外部观察者,我认为gradle正在做预期的事情。
您可以使用测试属性是否存在
if( property.isPresent() ) {
// do whatever
}
我敢打赌,当get()
返回约定时,isPresent()
会说false,但如果您调用set
,那么isPresent()
会返回true
。
还有其他方法可以帮助,比如:
def val = property.getOrElse( "SomeDefault" )
def maybe = property.getOrNull()
我确实认为Gradle并不总是能很好地从他们的主页和文档(即groovydoc(中访问API,以回答更复杂的问题:https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Property.html
这些方法是超级接口提供者,因此如果你不查找链,它们可能不明显可用:
https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Provider.html