【问题标题】:gradle kotlin dsl: how to create a shared function which uses a plugin class?gradle kotlin dsl:如何创建使用插件类的共享函数?
【发布时间】: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"
    }
  1. 我试图在根build.gradle.kts 中声明该函数,但我不知道如何从子模块访问它以及是否可能
  2. 我试图在 buildSrc 模块中声明它,但 com.android.build.api.variant.LibraryVariantBuilder 在这里未定义,因为插件 com.android.library 不存在这里,我认为它是不允许的和/或没有意义的

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

【问题讨论】:

    标签: android gradle android-gradle-plugin gradle-kotlin-dsl


    【解决方案1】:

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

    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")
    }
    
    1. 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 ?: "") }
    }
    
    1. library/build.gradle.ktsapp/build.gradle.kts
    android {
        androidComponents.beforeVariants {
            it.enabled = isFlavorEnabled(it)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 2019-08-29
      • 1970-01-01
      • 2021-03-25
      • 2018-02-17
      • 1970-01-01
      相关资源
      最近更新 更多