如何在 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错误<</p>

div class="ans>

最后,我受到了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'
    }
}

上面的块将定义除具有给定名称的模块之外的所有模块的依赖关系。

相关内容

  • 没有找到相关文章

最新更新