如何在多模块 Gradle 项目中声明“传递”风格依赖项?

问题描述 投票:0回答:1

例如我有3个模块(A、B和C),其中A依赖于B,B依赖于C(A->B->C)。模块 A 是构建过程的入口点,没有其他模块依赖于它,例如 Android 应用程序中的 :app 模块。 模块 A 和 C 具有相同的风味维度和相同的风味集(例如风味 1、风味 2、风味 3、风味 4 等)。模块 B 没有任何风格。

现在的问题是:如何将这些依赖关系定义为“可传递的”,使模块 A i 模块 C 的风格始终匹配?

模块 A(口味 1) -> 模块 B -> 模块 C(口味 1)

模块 A(风味 2) -> 模块 B -> 模块 C(风味 2)

模块A(口味3)->模块B->模块C(口味3)

等等..

如果所有 3 个模块具有相同的风格,Gradle 会自动匹配它们,但由于 B 没有风格,因此会发生错误,这已经在这个问题中描述过:Gradle 中基于多风格库的单风格模块 但没有一个答案是真正相关的:(

我现在需要的是,如果我运行 ./gradlew buildFlavor1Debug 来获取带有flavor1的模块A和C,并且通常让所有了解风味的模块与链开始时给出的风味相匹配,并且对于那些模块不知道口味只是转发/忽略它们。

missingDimensionStrategy 'dimension' 的问题在于它需要硬编码/固定依赖的风味,而不是基于构建的入口点动态,例如:missingDimensionStrategy 'myDimension' 'flavor1'

模块 A(口味 1) -> 模块 B -> 模块 C(口味 1)

模块 A(风味 2)-> 模块 B -> 模块 C(风味 1)

模块 A(口味 3) -> 模块 B -> 模块 C(口味 1)

等等..

android gradle android-gradle-plugin android-productflavors android-build-flavors
1个回答
0
投票

以下是为不同模块设置风格的方法:

// In the root `build.gradle` or module A's `build.gradle`
gradle.taskGraph.whenReady { taskGraph ->
    // Detect the selected flavor dynamically
    def selectedFlavor = taskGraph.allTasks.find { it.name.contains("Flavor1") } ? "flavor1" :
                         taskGraph.allTasks.find { it.name.contains("Flavor2") } ? "flavor2" :
                         taskGraph.allTasks.find { it.name.contains("Flavor3") } ? "flavor3" : null

    if (selectedFlavor != null) {
        project(":moduleC") {
            android {
                // Apply missingDimensionStrategy based on detected flavor
                flavorDimensions "yourFlavorDimension"
                missingDimensionStrategy "yourFlavorDimension", selectedFlavor
            }
        }
    }
}
  1. whenReady钩子检查任务图以确定Gradle正在尝试构建哪种风格,并根据模块A选择的风格动态设置模块C中所需的风格。

  2. 这种动态选择方法避免了在missingDimensionStrategy中对特定风格进行硬编码,确保模块C的风格始终与模块A的相匹配。

  3. 由于模块 B 没有风格,因此它不受影响,只是将依赖项传递给模块 C。

希望这对您有用。

© www.soinside.com 2019 - 2024. All rights reserved.