0

我想实现一个非常基本的事情(用任何普通语言):我想获得一个属性的默认值(约定)。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()

但这只是愚蠢的,因为您正在执行不必要的操作,而约定就在那里?

有谁知道如何在不清除价值的情况下获得它?

4

1 回答 1

0

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

您可以使用以下方法测试属性是否存在

if( property.isPresent() ) {
    // do whatever
}

我敢打赌,isPresent()当约定被返回时,这将是错误的get(),但如果你调用setthenisPresent()将会返回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

于 2022-03-05T14:47:30.043 回答