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.kts
和app/build.gradle.kts
android
androidComponents.beforeVariants
it.enabled = isFlavorEnabled(it)
【讨论】:
以上是关于gradle kotlin dsl:如何创建使用插件类的共享函数?的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gradle Kotlin DSL 发布 Kotlin MPP 元数据
如何使用 Gradle Kotlin DSL 对 Spring Boot 应用程序进行 Dockerize