您如何访问插件 Java 源代码中的 gradle.ext 属性?
How do you access gradle.ext properties in Plugin Java source code?
我需要一个 属性 以便(一)在应用插件时可用,并且(二)允许在 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
块之前不存在任何逻辑:
// build.gradle
plugins {
id 'com.myCompany.myPlugin' version 1.0.0 // 'myProp' must be set by now
}
我能想到的一种解决方法是使用:
// settings.gradle
gradle.ext.myProp = "overrideValue"
...但是在 Java 源代码(对于插件)中似乎没有访问 gradle.ext
属性的好方法,或者有吗?
这似乎适用于 gradle.ext.myProp
用例,但令我惊讶的是,唯一可行的方法是将 Gradle 对象转换为 ExtensionAware
对象:
// MyPlugin.java
String myProp = (String) project.getRootProject().getProperties().getOrDefault("myProp", null);
Gradle gradle = project.getRootProject().getGradle();
if ((myProp == null) && (gradle instanceof ExtensionAware)) {
ExtensionAware gradleExtensions = (ExtensionAware) gradle;
myProp = (String) gradleExtensions.getExtensions().getExtraProperties().get("myProp");
}
看来我的做法应该很常见,那么有没有更好的方法,比如只使用项目属性?
如果是,那么如何更改 settings.gradle
文件中的值?
这可能不是您想要的,但也许它仍然有帮助:您考虑过 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 初始化脚本。
我需要一个 属性 以便(一)在应用插件时可用,并且(二)允许在 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
块之前不存在任何逻辑:
// build.gradle
plugins {
id 'com.myCompany.myPlugin' version 1.0.0 // 'myProp' must be set by now
}
我能想到的一种解决方法是使用:
// settings.gradle
gradle.ext.myProp = "overrideValue"
...但是在 Java 源代码(对于插件)中似乎没有访问 gradle.ext
属性的好方法,或者有吗?
这似乎适用于 gradle.ext.myProp
用例,但令我惊讶的是,唯一可行的方法是将 Gradle 对象转换为 ExtensionAware
对象:
// MyPlugin.java
String myProp = (String) project.getRootProject().getProperties().getOrDefault("myProp", null);
Gradle gradle = project.getRootProject().getGradle();
if ((myProp == null) && (gradle instanceof ExtensionAware)) {
ExtensionAware gradleExtensions = (ExtensionAware) gradle;
myProp = (String) gradleExtensions.getExtensions().getExtraProperties().get("myProp");
}
看来我的做法应该很常见,那么有没有更好的方法,比如只使用项目属性?
如果是,那么如何更改 settings.gradle
文件中的值?
这可能不是您想要的,但也许它仍然有帮助:您考虑过 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 初始化脚本。