为不同风格的维度组合设置不同的版本代码[Kotlin DSL]

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

在我的应用程序中,我有 2 个维度“应用程序”和“服务器”,其中我有 4 种风格。现在我想为不同的口味组合使用不同的版本代码。

例如:-

  • 对于 ApponeLive 我想要版本代码 1。
  • 对于 ApponeStaging 我想要版本代码 2。

build.gradle.kts

flavorDimensions.add("app")
flavorDimensions.add("server")

productFlavors {
    create("Appone") {
        val appName = "App One"
        applicationId = "com.app.one"
        dimension = "app"
        resValue("string", "appName", appName)
        manifestPlaceholders["launcherName"] = appName
    }

    create("Apptwo") {
        val appName = "App Two"
        applicationId = "com.app.two"
        dimension = "app"
        resValue("string", "appName", appName)
        manifestPlaceholders["launcherName"] = appName
    }

    create("live") {
        dimension = "server"
        manifestPlaceholders["appNameSuffix"] = ""
    }

    create("staging") {
        dimension = "server"
        applicationIdSuffix = ".staging"
        versionNameSuffix = "-staging"
        manifestPlaceholders["appNameSuffix"] = " Staging"
    }
}

我尝试使用 "applicationVariants.configureEach { }" 设置版本代码,但 versionCode 是 val,这意味着它无法重新分配。

根据“ProductFlavor.kt”

与此风味相关的版本代码,如果没有,则为 null 放。这只是对该产品风味设定的值,而不是 必须是实际使用的版本代码。

applicationVariants.configureEach {

        val app = productFlavors[0].name
        val server = productFlavors[1].name

        if (app == "Appone" && server == "live"){
            mergedFlavor.versionCode = 1
        }else if (app == "Appone" && server == "staging"){
            mergedFlavor.versionCode = 2
        }else {
            //Do something..
        }
    }

我什至尝试通过转换 “MergedFlavor”,但它导致 gradle 任务失败,并显示了我认为是针对 Groovy 的。

applicationVariants.configureEach {

        val app = productFlavors[0].name
        val server = productFlavors[1].name

        if (app == "Appone" && server == "live"){
            (mergedFlavor as MergedFlavor).versionCode = 1
        }else if (app == "Appone" && server == "staging"){
            (mergedFlavor as MergedFlavor).versionCode = 2
        }else {
            //Do something..
        }
    }

梯度错误

versionCode 不能直接在 mergedFlavor 上设置。 可以使用以下命令为变体输出设置 versionCodeOverride 以下语法:

android {
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            output.versionCodeOverride = 1
        }
    } 
} 

现在我没有主意了,任何形式的帮助将不胜感激。

android kotlin android-gradle-plugin gradle-kotlin-dsl
1个回答
0
投票

经过一番研究,我想出了这个,它对我有用,但我不确定这是否是最佳解决方案。

如果可以进行任何优化,请告诉我。

android {
    androidComponents.onVariants {
        val app = it.productFlavors[0].second
        val server = it.productFlavors[1].second
        val output = it.outputs.firstOrNull() ?: return@onVariants


        if (app == "Appone" && server == "live"){
            output.versionCode.set(1)
        }else if (app == "Appone" && server == "staging"){
            output.versionCode.set(2)
        }else {
            //Add your logic
        }
    
    } 
}

解释

fun onVariants(
        selector: VariantSelector = selector().all(),
        callback: (VariantT) -> Unit
)

回调中执行的代码还可以访问用于配置 org.gradle.api.Task 输入的 VariantT 信息(例如,buildConfigFields)。仍可以修改表示为 org.gradle.api.provider.Property 的此类信息,确保 Android Gradle 插件创建的所有 org.gradle.api.Tasks 使用更新后的值。

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