首页 > 解决方案 > 如何使用 gradlew 列出所有构建变体?

问题描述

是否可以使用gradlew或其他命令行工具列出所有构建变体?

例如以下build.gradle

buildTypes {
    debug {}
    release {}
}
productFlavors {
    dev {}
    prod {}
}

该命令将返回如下内容:

devDebug
devRelease
prodDebug
prodRelease

一种选择是在 my 中创建一个 gradle 任务,build.gradle然后我将使用gradlew. 但我正在寻找一种通用的解决方案,它适用于任何项目而无需添加任何东西。

标签: androidgradleandroid-gradle-pluginbuild.gradle

解决方案


据我所知,没有一项任务可以输出所有变体。创建这样的任务并不难,但我认为这里可能有适合您的用例的更好解决方案。

所以你在这里有几个选择。首先,gradle 任务的设置方式使您的示例具有以下任务:

assemble
assembleDev
assembleProd
assembleDebug
assembleRelease
assembleDevDebug
assembleDevRelease
assembleProdDebug
assembleProdRelease

如果您的目标是构建所有变体,那么您可以简单地运行:app:assemble,并且将构建所有 productFlavor 和 buildType 变体。如果您只想要发布版本,但每种风格,那么您可以这样做:app:assembleRelease,并且会自动运行

assembleDevRelease
assembleProdRelease

许多其他任务也遵循相同的模式。但不一定全部。因此,正如 Stephan 在https://stackoverflow.com/a/69254774/2923245中提到的那样,运行:app:tasks可以是查看您有哪些可用任务的良好开端。


如果您确实需要一个输出每个变体名称的任务(或者您想在代码中访问这些名称),那么您可以执行以下操作:

task("printVariants") {
    doFirst {
        println project.getExtensions().getByType(com.android.build.gradle.AppExtension.class).applicationVariants*.name
    }
}

或者,如果您想为每个变体做一些事情,那么就像:

AppExtension android = project.getExtensions().getByType(AppExtension.class)
android.applicationVariants.each { appVariant ->
    // Variant-specific code goes here.
    // Example below: Creating a task for each variant.
    project.tasks.create("${appVariant.name}MyVariantSpecificTask", ...)
}

它有助于记住 build.gradle 只是代码。你可以在这里编写任何代码——只要你对 Groovy 和 gradle + android gradle plugin(AGP) api 感到满意。


推荐阅读