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

Gradle - Get the default value (convention) of a Property

我想实现一个非常基本的事情(在任何普通语言中):我想获得 属性 的默认值(约定)。 Gradle 章 Lazy configuration 中的文档描述了如何将约定应用于 属性:

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

但这只是愚蠢,因为你在做不必要的动作,而惯例在那里?

有谁知道不清除值怎么得到的吗?

我将尝试回答为什么 set 在调用后会覆盖 conventionconvention 是默认值,一旦 属性 通过调用 set 有一个值,convention 就会被忽略,因为 属性 有一个值。这是有道理的,因为这就是默认值的含义。如果我有一个值,则使用该值,否则使用此默认值。 Conventionset 似乎遵循这种模式。我不太明白为什么这对你想如何使用 gradle 感到惊讶,但作为一个外部观察者,我认为 gradle 正在做预期的事情。

您可以使用

测试属性是否存在
if( property.isPresent() ) {
    // do whatever
}

我打赌 isPresent() 会在 return 被 get() 编辑时说假,但如果你调用 set 那么 isPresent() 将会 return true.

然后还有其他方法可以提供帮助,例如:

def val = property.getOrElse( "SomeDefault" )
def maybe = property.getOrNull()

我确实认为 Gradle 并不总能很好地使 API 从他们的主页和文档(即 groovydoc)可以很容易地访问以回答更复杂的问题: https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Property.html

这些方法是超级接口 Provider,因此如果您不查找链,它们可能不可用的原因可能不明显:

https://docs.gradle.org/current/javadoc/org/gradle/api/provider/Provider.html

答案(对于 2022)是:不,你无法获取 属性 的默认值(约定)。