我想实现一个非常基本的东西(在任何正常语言中):我想得到一个属性的默认值(约定)。在第懒惰配置章中,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-03-16 14:22:37
答案(对于2022年)是:否,您无法获得属性的默认值(约定)。
发布于 2022-03-05 14:47:30
我将尝试回答为什么set一调用convention就会重写它。convention是默认值,一旦属性通过调用set获得一个值,则convention将被忽略,因为该属性具有一个值。这是合理的,因为这就是默认值应该意味着什么。如果我有一个值,那就使用这个默认值。Convention和set似乎遵循了这种模式。我不太明白为什么这会让你对如何使用gradle感到惊讶,但作为一个外部观察者,我认为gradle正在做的是预期的事情。
可以使用以下方法测试属性是否存在
if( property.isPresent() ) {
// do whatever
}我敢打赌,isPresent()将在get()返回约定时说假,但如果调用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
https://stackoverflow.com/questions/71360729
复制相似问题