2

我需要一个属性(一个)在应用插件时可用,并且(两个)允许在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"

...但是似乎没有访问gradle.extJava源代码(对于插件)中的属性的好方法,或者有吗?

4

2 回答 2

1

这似乎适用于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文件中的值?

于 2021-02-09T20:58:48.770 回答
0

这可能不是您正在寻找的,但也许它仍然有帮助:您是否考虑过初始化脚本?在这样的脚本,可以覆盖项目属性。

例子:

$ ./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'
}

请注意,还有其他方法可以指定初始化脚本。

于 2021-02-10T21:25:18.490 回答