如何在 BuildSrc 中创建 FlavorConfig?

Posted

技术标签:

【中文标题】如何在 BuildSrc 中创建 FlavorConfig?【英文标题】:How to create a FlavorConfig in BuildSrc? 【发布时间】:2020-03-15 05:54:26 【问题描述】:

我正在尝试创建一个 Flavor 配置以避免每个模块和库 gradle 文件中的样板代码。

为此,我正在尝试转换 Piotr Zawadzki 解决方案 (https://medium.com/stepstone-tech/modularizing-your-flavored-android-project-5db75c59fb0d),该解决方案使用 groovy with() 方法与包含风味配置的闭包相结合。

ext.flavorConfig =  // 1

    flavorDimensions "pricing"
    productFlavors 
        free 
            dimension "pricing"
            ext.myApplicationIdSuffix = '.free' // 2
        
        paid 
            dimension "pricing"
            ext.myApplicationIdSuffix = '.paid'
        
    

    productFlavors.all  flavor -> // 3
        if (flavor.hasProperty('myApplicationIdSuffix') && isApplicationProject()) 
            flavor.applicationIdSuffix = flavor.myApplicationIdSuffix
        
    



def isApplicationProject()  // 4
    return project.android.class.simpleName.startsWith('BaseAppModuleExtension')
    // in AGP 3.1.x with library modules instead of feature modules:
    // return project.android instanceof com.android.build.gradle.AppExtension


我没有找到与 Kotlin DSL 等效的 with() 方法或翻译闭包的正确方法。

【问题讨论】:

【参考方案1】:

等价的应该是applyrun,这取决于with 的实际返回值(由于某种原因我无法弄清楚)。

【讨论】:

【参考方案2】:

我用 KotlinScript 找到了一个解决方案,我认为它也可以用 Groovy 完成。

首先,在你的 buildSrc/build.gradle.kts 文件中添加 gradle-api 依赖

//buildSrc/build.gradle.kts

val agpVersion = "7.1.1"

plugins 
    `kotlin-dsl`


repositories 
    mavenCentral()
    google()


dependencies
    implementation("com.android.tools.build:gradle-api:$agpVersion")

然后在 buildSrc 中创建一个 Gradle 插件。

//buildSrc/src/main/kotlin/FooPlugin.kt

abstract class FooPlugin : Plugin<Project> 
    override fun apply(project: Project) 
        val android = project.extensions.getByType(ApplicationExtension::class.java)
        android.defaultConfig 
            android.productFlavors.create("Bar")
        
    

最后将 FooPlugin 应用到应用程序的 build.gradle.kts

//baz/build.gradle.kts

plugins 
    ...


apply<FooPlugin>()

android
    ...


dependencies 
    ...

【讨论】:

以上是关于如何在 BuildSrc 中创建 FlavorConfig?的主要内容,如果未能解决你的问题,请参考以下文章

Gradle自己定义插件

Gradle自定义插件

技术干货 | Gradle自定义插件

如何像在 babelrc 中创建依赖别名一样在 typescript 中创建类型别名?

在 buildSrc 中定义的 Gradle Kotlin DSL 未解析的引用

在 Azure Blob 容器中创建两个文件时,如何在 Azure 数据工厂中创建事件触发器?