【问题标题】:How do you access gradle.ext properties in Plugin Java source code?如何访问 Plugin Java 源代码中的 gradle.ext 属性?
【发布时间】:2021-02-09 20:58:48
【问题描述】:

我需要一个属性(一个)在应用插件时可用,并且(两个)允许在settings.gradle 文件中计算覆盖值。项目属性将是理想的,因为它可以在gradle.properties 中设置默认值:

# gradle.properties
myProp=originalValue

这很棒,因为它可以被-PmyProp=newValue 之类的命令行参数覆盖,但我无法在build.gradle 执行之前找到覆盖settings.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 properties build.gradle gradle-plugin gradle.properties


    【解决方案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 文件中的值?

    【讨论】:

      【解决方案2】:

      这可能不是您想要的,但也许它仍然有帮助:您考虑过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 脚本。

      【讨论】:

      • 这是一个好点,但我的主要困难是如何使用逻辑/代码更改项目属性(我相信这必须发生在settings.gradle 文件中),所以它可以设置/应用插件时更改? 运行构建的所有用户都需要这样做。 似乎无法在 settings.gradle 文件中操作项目属性,所以我不得不使用 Gradle 属性。
      猜你喜欢
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多