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
在调用后会覆盖 convention
。 convention
是默认值,一旦 属性 通过调用 set
有一个值,convention
就会被忽略,因为 属性 有一个值。这是有道理的,因为这就是默认值的含义。如果我有一个值,则使用该值,否则使用此默认值。 Convention
和 set
似乎遵循这种模式。我不太明白为什么这对你想如何使用 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)是:不,你无法获取 属性 的默认值(约定)。
我想实现一个非常基本的事情(在任何普通语言中):我想获得 属性 的默认值(约定)。 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
在调用后会覆盖 convention
。 convention
是默认值,一旦 属性 通过调用 set
有一个值,convention
就会被忽略,因为 属性 有一个值。这是有道理的,因为这就是默认值的含义。如果我有一个值,则使用该值,否则使用此默认值。 Convention
和 set
似乎遵循这种模式。我不太明白为什么这对你想如何使用 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)是:不,你无法获取 属性 的默认值(约定)。