提问人:jane 提问时间:11/15/2023 最后编辑:jane 更新时间:11/21/2023 访问量:60
如何在gradle.properties中访问当前的构建变体?
How to access current build variant in gradle.properties?
问:
每当我通过 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同步时访问该值,而不是在构建项目时访问
答:
为此,请使用 Gradle project.ext 属性在 build.gradle 文件中设置项目范围的变量,然后在设置中使用该变量。Gradle 有条件地合并模块。
在 build.gradle 文件中(通常在应用模块级别),设置项目范围的属性:
android { buildTypes { debug { project.ext.set("currentFlavor", "debug") } release { project.ext.set("currentFlavor", "release") } } }
然后转到 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 文件。
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")
}
}
}
- 对于:它也无法识别设置文件中的项目: > 无法获取 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 = ""
}
}
评论
project
> Could not get unknown property 'project' for settings 'test' of type org.gradle.initialization.DefaultSettings.
我想要的是在 Gradle 同步时访问当前活动的构建变体,这样我就可以为不同的模块使用不同的 Maven 存储库。我无法访问该数据。我最终做的是从项目级别的build.gradle中删除存储库,并为具有特定存储库的每个模块创建文件:settings.gradle
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
repositories {
maven {//your specific configuration}
因此,这样在项目中声明的任何存储库都将被忽略,它将使用来自单独设置文件的存储库。
评论
using specific flavor implementations (debugImplementation, releaseImplementation) doesn't work; those two modules give conflict even tho they shouldn't.
- 不清楚“冲突”是什么意思,但从 Android Gradle 插件访问 flavor 值是解决问题的正确方法。你试图做的事情感觉很糟糕,我会专注于理解为什么你原来的方法不起作用,而不是试图找到解决方法。