使用Gradle DSL声明多模块项目中的风味依赖

时间:2020-06-12 08:45:45

标签: android android-productflavors gradle-kotlin-dsl

假设:

  • 模块 M (Android库)具有口味 M1 M2
  • 功能模块 F 取决于模块 M
  • 应用程序 A 取决于功能模块 F ,并具有风味 A1 A2 (与 M 中的维度不同)
  • 此外,应用程序 A 风味 A1 取决于 M1 ,而 A2 取决于 M2

是否可以在Gradle Kotlin DSL中配置此类依赖项?特别是考虑模块 F 时,对 A1 A2 口味一无所知。

使用某些额外信息进行编辑:在我的特定情况下, M1 M2 仅用于引入特定资产。因此, F 并不关心这些,因此通常对 M 具有依赖性。

2 个答案:

答案 0 :(得分:2)

我能够用missingDimensionStrategy解决您的问题。

以下是简短的脚本:

module / build.gradle.kts

android {
    flavorDimensions("module-dimension")
    productFlavors {
        create("module1") {
            setDimension("module-dimension")
        }
        create("module2") {
            setDimension("module-dimension")
        }
    }
}

功能/build.gradle.kts

android {
    flavorDimensions("feature-dimension")
    productFlavors {
        create("feature1") {
            setDimension("feature-dimension")
            // Tells gradle to use "module1" flavor of the "module" module for this flavor.
            missingDimensionStrategy("module-dimension", "module1")
        }
        create("feature2") {
            setDimension("feature-dimension")
            missingDimensionStrategy("module-dimension", "module2")
        }
    }
}

dependencies {
    implementation(project(":module"))
}

我必须将风味 F1 F2 引入 F 模块(我猜这是一个android库模块)。您说“功能模块 F 取决于模块 M ”,但是 M 是哪种类型?我猜想这是应用程序所依赖的味道。无论如何,如果您不在功能模块中提供风味特定的代码,则结果是相同的。

app / build.gradle.kts

android {
    flavorDimensions("app-dimension")
    productFlavors {
        create("app1") {
            setDimension("app-dimension")
            missingDimensionStrategy("module-dimension", "module1")
            missingDimensionStrategy("feature-dimension", "feature1")
        }
        create("app2") {
            setDimension("app-dimension")
            missingDimensionStrategy("module-dimension", "module2")
            missingDimensionStrategy("feature-dimension", "feature2")
        }
    }
}

dependencies {
    implementation(project(":module"))
    implementation(project(":feature"))
}

如果 F 仅取决于 M ,则可以通过将 F 的风味和风味尺寸重命名为与 M 口味相同。这样,您就不必在 F 中指定missingDimensionStrategy,而只使用其中之一而不是 A 中的两个。这是因为当风味在各个模块之间匹配时,构建系统会自动解析正确的风味。

您会看到,当您更改 A 的样式时,Android Studio会自动为 F M 选择正确的样式。

根据您的要求, F A1 A2 一无所知。我希望这回答了你的问题。如果没有,请发表评论。 Here's a sample project showing this

答案 1 :(得分:0)

遇到同样的问题
您只需将您的口味描述从 :app gradle 复制到 :module gradle 并更改路径
我的文件:
应用:
enter image description here

登录模块: enter image description here