【问题标题】:How to list all build variants using gradlew?如何使用 gradlew 列出所有构建变体?
【发布时间】:2021-09-07 21:03:29
【问题描述】:

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

例如对于以下build.gradle

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

该命令将返回如下内容:

devDebug
devRelease
prodDebug
prodRelease

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

【问题讨论】:

  • 您能提供更多信息吗?例如,您是否正在构建脚本以自动选择变体并为其构建 apk?
  • @HossamHassan 我正在编写一个帮助脚本,我可以使用它选择多个变体来构建和存储在某个位置,我需要该脚本是通用的并且适用于所有项目。

标签: android gradle android-gradle-plugin build.gradle


【解决方案1】:

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

所以你在这里有几个选择。首先,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's。

【讨论】:

    【解决方案2】:

    Gradle 已经有一个任务,叫做tasks

    ./gradlew tasks
    

    【讨论】:

      猜你喜欢
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 2018-08-05
      相关资源
      最近更新 更多