如何在gradle.properties中访问当前的构建变体?

How to access current build variant in gradle.properties?

提问人:jane 提问时间:11/15/2023 最后编辑:jane 更新时间:11/21/2023 访问量:60

问:

每当我通过 Android Studio 界面更改构建变体时,我都需要在 gradle 属性中访问当前的构建变体。有什么方法可以访问该值吗?

问题:

因此,我有两个模块需要根据特定的构建变体进行包含。但是使用特定的风格实现(debugImplementation、releaseImplementation)不起作用;这两个模块甚至不应该发生冲突。作为解决方法,我这样做了:我在gradle.properties中创建了一个flavor变量,并根据该属性将模块包含在settings.gradle中:

gradle.properties:

flavor = pos

settings.gradle:

if (getProperty("flavor") == "host"){
    include ':host'
}
if (getProperty("flavor") == "pos"){
    include ':pos'
}

它的工作原理是这样的,但我想自动执行此过程,因为我不想在每次更改构建变体时都更改变量。我需要在gradle同步时访问该值,而不是在构建项目时访问

Android Kotlin Gradle Groovy

评论

0赞 Egor 11/15/2023
gradle.properties 只是一个静态文件,它不能包含任何访问动态属性的逻辑。您的问题听起来有点像 XY 问题,您要解决的问题到底是什么?
1赞 Egor 11/15/2023
using specific flavor implementations (debugImplementation, releaseImplementation) doesn't work; those two modules give conflict even tho they shouldn't.- 不清楚“冲突”是什么意思,但从 Android Gradle 插件访问 flavor 值是解决问题的正确方法。你试图做的事情感觉很糟糕,我会专注于理解为什么你原来的方法不起作用,而不是试图找到解决方法。
0赞 jane 11/16/2023
@Egor是的,你是对的。但我原始方法的问题是我希望拥有具有不同风格配置的存储库(在项目级构建 gradle 中)。但我找不到该怎么做。所以我选择这样做。

答:

2赞 Oyindamola Gideon Olarewaju 11/16/2023 #1

为此,请使用 Gradle project.ext 属性在 build.gradle 文件中设置项目范围的变量,然后在设置中使用该变量。Gradle 有条件地合并模块。

  1. 在 build.gradle 文件中(通常在应用模块级别),设置项目范围的属性:

    android {
    
     buildTypes {
         debug {
             project.ext.set("currentFlavor", 
     "debug")
         }
         release {
             project.ext.set("currentFlavor", 
     "release")
         }
     }
    }
    
  2. 然后转到 settings.gradle 文件并检查 currentFlavor 属性的值,并包含相应的模块:

    if (project.hasProperty(“currentFlavor”)) { def currentFlavor = 项目.currentFlavor 如果 (currentFlavor == “调试”) { 包括 ':host' } else if (currentFlavor == “release”) { 包含“:p os” } }

现在,当您在 Android Studio 界面中更改构建变体时,currentFlavor 属性会更新,并且会将必要的模块添加到设置中。Gradle 同步过程中的 Gradle。这样一来,您就无需在修改构建变体时手动更新 gradle.properties 文件。

  1. app 模块的 build.gradle 文件包含该模块独有的 project.ext 属性。如果您希望在项目级别(在主项目或任何子项目中)使用 currentFlavor 变量,则还必须在项目级别声明该变量。

    '// 项目级 build.gradle

    所有项目 { 分机 { 其他项目级属性可以 这里 当前风味 = “” } }

只需确保在应用模块的 build.gradle 文件或任何其他需要的模块中为 currentFlavor 分配一个值即可。

  `// app-level build.gradle

   android {
   buildTypes {
       debug {
        project.ext.set("currentFlavor", 
   "debug")
    }
    release {
        project.ext.set("currentFlavor", 
   "release")
    }
    }
   }
  1. 对于:它也无法识别设置文件中的项目: > 无法获取 org.gradle.initialization.DefaultSettings 类型的设置“test”的未知属性“project”。

由于 settings.gradle 脚本是在定义项目之前执行的,因此无法立即访问 settings.gradle 文件中的项目变量。因此,项目变量仍超出其范围。

rootProject 变量可用于检索 settings.gradle 文件中的项目属性。在多项目生成中,根项目称为 rootProject。

  `// settings.gradle

  if (rootProject.hasProperty("currentFlavor")) 
 {
 def currentFlavor = rootProject.currentFlavor
 if (currentFlavor == "debug") {
    include ':host'
 } else if (currentFlavor == "release") {
    include ':pos'
 }`

确保您已在根项目的 build.gradle 文件中声明了 currentFlavor 属性,如前所述:

  // project-level build.gradle

  allprojects {
    ext {
        currentFlavor = ""
    }
  }

评论

0赞 jane 11/16/2023
如果我在应用级 gradle 中声明了这个 currentFlavor 变量,我也可以在项目级 gradle 中使用这个变量吗?
0赞 jane 11/16/2023
此外,它无法识别内部设置文件:project> Could not get unknown property 'project' for settings 'test' of type org.gradle.initialization.DefaultSettings.
0赞 Oyindamola Gideon Olarewaju 11/16/2023
app 模块的 build.gradle 文件包含该模块独有的 project.ext 属性。如果您希望在项目级别(在主项目或任何子项目中)使用 currentFlavor 变量,则还必须在项目级别声明该变量。以下示例说明了如何在项目级别的 build.gradle 文件中声明它。项目级 build.gradle allprojects { ext { // 其他项目级属性可以转到此处 currentFlavor = “” } }
0赞 jane 11/16/2023
明白了。但我需要访问 productFlavor 而不是构建类型(如您在答案中所示)。即使在 productFlavor{} 中执行相同的方法,代码也会在每种风格中被激活,而不仅仅是在处于活动状态的风格中。所以最终它给出了不正确的味道
0赞 jane 11/21/2023 #2

我想要的是在 Gradle 同步时访问当前活动的构建变体,这样我就可以为不同的模块使用不同的 Maven 存储库。我无法访问该数据。我最终做的是从项目级别的build.gradle中删除存储库,并为具有特定存储库的每个模块创建文件:settings.gradle

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
        maven {//your specific configuration}

因此,这样在项目中声明的任何存储库都将被忽略,它将使用来自单独设置文件的存储库。