Gradle-获取属性的默认值(约定)



我想实现一件非常基本的事情(在任何正常语言中(:我想获得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

最新更新