问题描述
我需要一个属性(一)在应用插件时可用,(二)允许在 settings.gradle
文件中计算覆盖值。项目属性是理想的,因为它可以在 gradle.properties
中设置默认值:
# gradle.properties
myProp=originalValue
这很棒,因为它可以用命令行参数(如 -PmyProp=newValue
}} 执行(即在应用插件之前)。
例如,所有这些都在插件应用程序中保持 settings.gradle
不变:
build.gradle
我们也不能在 rootProject.myProp
中做任何魔术,因为在 // settings.gradle
rootProject.getProperties.put("myProp","overrideValue")
settings.ext.myProp = "overrideValue"
settings.extensions.myProp = "overrideValue"
gradle.startParameters.projectProperties.myProp = "overrideValue"
块之前不存在逻辑:
build.gradle
我能想到的一种解决方法是使用:
plugins
...但是在 Java 源代码(对于插件)中访问 // build.gradle
plugins {
id 'com.myCompany.myPlugin' version 1.0.0 // 'myProp' must be set by Now
}
属性似乎不是一个好方法,或者有吗?
解决方法
这似乎适用于 // settings.gradle
gradle.ext.myProp = "overrideValue"
用例,但令我惊讶的是唯一可行的方法是将 Gradle 对象强制转换为 gradle.ext
对象:
gradle.ext.myProp
看起来我想做的事情应该是司空见惯的,那么有没有更好的方法,比如单独使用项目属性?
如果是这样,那么您如何更改 ExtensionAware
文件中的值?
这可能不是您要找的东西,但也许它仍然有帮助:您考虑过 initialization script 吗?在这样的脚本中,可以覆盖项目属性。
示例:
$ ./gradlew -PmyProp=originalValue properties | grep myProp
myProp: originalValue
$ ./gradlew -PmyProp=originalValue -I init.gradle properties | grep myProp
myProp: overrideValue
... 其中 init.gradle
如下:
allprojects {
project.ext.myProp = 'overrideValue'
}
请注意,还有 other ways of specifying init 脚本。