首页 > 解决方案 > 如何在 Kotlin Gradle DSL 中为多个模块重用部分 Android 配置?

问题描述

我有一个多模块 Android 项目和 Kotlin Gradle DSL。有一些配置必须在每个模块中重复,我想重用代码。我想重用例如这段代码:

android {
    sourceSets {
        getByName("main").java.srcDirs("src/main/kotlin")
        getByName("test").java.srcDirs("src/test/kotlin")
    }
}

Kotlin DSL 示例中记录了两种方法:

apply(from = "foo.gradle.kts")

和扩展功能是buildSrc这样的:

fun Project.kotlinProject() {
   dependencies {
     "compile"(kotlin("stdlib"))
   }
}

但是这两种方法都只适用于顶级配置,我无法访问 Android 插件的东西。我收到类似的错误Unresolved reference: BaseExtension

标签: androidgradlekotlingradle-kotlin-dsl

解决方案


最后我受到了SUPERCILEX 代码的启发:

allprojects {
    val parent = (group as String).split(".").getOrNull(1)
    when {
        name == "app" -> {
            apply(plugin = "com.android.application")
            configureAndroidModule()
        }
        parent == "common-android" -> {
            apply(plugin = "com.android.library")
            configureAndroidModule()
        }
    }
}

fun Project.configureAndroidModule() {
    configure<BaseExtension> {
        sourceSets {
            getByName("main").java.srcDirs("src/main/kotlin")
            getByName("test").java.srcDirs("src/test/kotlin")
        }
    }
}​

推荐阅读