我有一个多模块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
答案 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")
}
}
}
上面的块将定义对除具有给定名称的模块以外的所有模块的依赖性。