首页 > 解决方案 > 如何访问 Plugin Java 源代码中的 gradle.ext 属性?

问题描述

我需要一个属性(一个)在应用插件时可用,并且(两个)允许在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源代码(对于插件)中的属性的好方法,或者有吗?

标签: gradlepropertiesbuild.gradlegradle-plugingradle.properties

解决方案


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


推荐阅读