我有一个多模块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
错误<</p>
最后,我受到了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")
}
}
}
使用子项目块怎么样?我有一个多模块的Android项目,这就是我在构建脚本中重用代码的方式。
subprojects {
apply plugin: 'com.android.library'
android {
sourceSets {
getByName("main").java.srcDirs("src/main/kotlin")
getByName("test").java.srcDirs("src/test/kotlin")
}
}
}
未解析的引用:基本扩展
至于上面的错误消息,如果你想使用 android block,你应该通过应用上面构建脚本等插件来将你的模块声明为 android 应用程序或库。
如果您希望仅在某些模块中重复设置,则可以像这样使用配置块:
configure(subprojects - project(':${module_name}')) {
dependencies {
implementation 'com.x.y.z:abc:1.0.0'
}
}
上面的块将定义除具有给定名称的模块之外的所有模块的依赖关系。