gradle kotlin dsl:如何创建使用插件类的共享函数?

Posted

技术标签:

【中文标题】gradle kotlin dsl:如何创建使用插件类的共享函数?【英文标题】:gradle kotlin dsl: how to create a shared function which uses a plugin class? 【发布时间】:2021-12-16 12:31:37 【问题描述】:

一个简化的子模块build.gradle.kts:

    plugins 
        id("com.android.library")
        kotlin("android")
    

    android 
         androidComponents.beforeVariants  it: com.android.build.api.variant.LibraryVariantBuilder ->
              it.enabled = run 
                   // logic to calculate if
                   it.productFlavors[0].second == "flavor" && it.buildType == "debug"
              
         
    

是否可以提取函数来计算 buildVariant 的启用状态?

    fun calculateIsEnabled(lvb: com.android.build.api.variant.LibraryVariantBuilder): Boolean 
         return lvb.productFlavors[0].second == "flavor" && lvb.buildType == "debug"
    
    我试图在根build.gradle.kts 中声明该函数,但我不知道如何从子模块访问它以及是否可能 我试图在 buildSrc 模块中声明它,但 com.android.build.api.variant.LibraryVariantBuilder 在这里未定义,因为插件 com.android.library 不存在这里,我认为它是不允许的和/或没有意义的

所以,问题是:在哪里声明一个共享函数,该函数使用 gradle 插件中定义的类型并且需要在所有类型为 android 库的子模块中访问?

【问题讨论】:

【参考方案1】:

经过多次尝试,我解决了:

    buildSrc/build.gradle.kts
repositories 
    google()
    mavenCentral()


plugins 
    `kotlin-dsl`


dependencies 
     // important: dependency only in simple string format!
     implementation("com.android.tools.build:gradle:7.2.0-alpha03")

    buildSrc/src/main/kotlin/Flavors.kt
import com.android.build.api.variant.LibraryVariantBuilder
import com.android.build.api.variant.ApplicationVariantBuilder

private fun isFlavorEnabled(flavor1: String, buildType: String): Boolean     
    return flavor1 == "flavor" && buildType == "debug"


fun isFlavorEnabled(lvb: LibraryVariantBuilder): Boolean 
    // productFlavors are pairs of flavorType(dimension) - flavorName(selectedFlavor)
    return lvb.run  isFlavorEnabled(productFlavors[0].second, buildType ?: "") 


fun isFlavorEnabled(avb: ApplicationVariantBuilder): Boolean 
    return avb.run  isFlavorEnabled(productFlavors[0].second, buildType ?: "") 

    library/build.gradle.ktsapp/build.gradle.kts
android 
    androidComponents.beforeVariants 
        it.enabled = isFlavorEnabled(it)
    

【讨论】:

以上是关于gradle kotlin dsl:如何创建使用插件类的共享函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 gradle kotlin-dsl 添加新的源集

使用 Gradle Kotlin DSL 发布 Kotlin MPP 元数据

使用 Kotlin DSL

如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize

Kotlin DSL 中的 gradle 额外属性是如何设置的?

如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?