您如何访问插件 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 初始化脚本。