如何在Kotlin Gradle DSL中为多个模块重用Android配置的一部分?

时间:2018-12-28 12:11:35

标签: android gradle kotlin gradle-kotlin-dsl

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

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

Kotlin DSL samples中记录了两种方法:

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

buildSrc中的扩展功能是这样的:

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

但是这两种方法仅适用于顶级配置,我无法访问Android插件的内容。我遇到类似Unresolved reference: BaseExtension

的错误

2 个答案:

答案 0 :(得分:1)

最后,我受到SUPERCILEX's code的启发:

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")
        }
    }
}​

答案 1 :(得分:0)

如何使用子项目块?我有一个多模块的Android项目,这就是我在构建脚本中重用代码的方式。

Module not found: Error: Can't resolve '@angular/http' even i used import {HttpClientModule} from '@angular/common/http';
  

未解决的参考:BaseExtension

对于上述错误消息,如果要使用android块,则应通过应用上述构建脚本之类的插件将模块声明为android应用程序或库。

如果只想在某些模块中重复设置,则可以使用configure块,如下所示:

subprojects {
    apply plugin: 'com.android.library'
    android {
        sourceSets {
            getByName("main").java.srcDirs("src/main/kotlin")
            getByName("test").java.srcDirs("src/test/kotlin")
        }
    }
}

上面的块将定义对除具有给定名称的模块以外的所有模块的依赖性。