为不同风格的维度组合设置不同的versionCode [KotlinDSL]

0lvr5msh  于 2023-11-21  发布在  Kotlin
关注(0)|答案(1)|浏览(158)

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

  • 对于 ApponeLive,我希望有版本代码1。
  • 对于 ApponeStaging,我希望使用versionCode 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为瓦尔,这意味着无法重新分配。
根据 “ProductFlavor.kt”
与此风味关联的版本代码,如果没有设置,则为空。这只是在此产品风味上设置的值,不一定是使用的实际版本代码。

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..
        }
    }

*Gradle错误 *

无法直接在mergedFlavor上设置versionCode。可以使用以下语法为变量输出设置versionCodeCode:

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


现在我没有办法了,任何帮助都将不胜感激。

rekjcdws

rekjcdws1#

经过一些研究,我想出了这个,它为我工作,但我不确定这是否是一个最佳解决方案。
让我知道是否可以做任何优化。

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. Task都使用更新后的值。

相关问题