引言:什么是单一代码库,为什么Kotlin开发者需要它
单一代码库(monorepo)是一种将多个项目或模块的代码存储在一个仓库中的方法。在Kotlin的上下文中,这尤其方便:您可以将服务器端(Ktor)、库、CLI工具甚至移动应用程序(Kotlin Multiplatform)统一到一个结构中。对于初学者开发者来说,单一代码库简化了导航、测试和协作。
在本文中,我们将探讨如何使用Gradle多项目构建来组织使用Kotlin的单一代码库。您将学习如何正确构建文件夹结构、配置依赖关系以及避免常见错误。
主体部分:创建使用Kotlin的单一代码库
1. 单一代码库的结构:基本原则
正确的结构是成功的关键。在Kotlin单一代码库中,每个模块都是一个独立的Gradle子项目。以下是典型的方案:
my-monorepo/├── build.gradle.kts # 根构建文件├── settings.gradle.kts # 模块配置├── gradle.properties # 公共属性├── shared/ # 公共库(模块)│ ├── build.gradle.kts│ └── src/│ └── main/│ └── kotlin/│ └── com/example/shared/│ └── Utils.kt├── backend/ # 服务器模块(Ktor)│ ├── build.gradle.kts│ └── src/│ └── main/│ └── kotlin/│ └── com/example/backend/│ └── Application.kt└── cli-tool/ # CLI工具 ├── build.gradle.kts └── src/ └── main/ └── kotlin/ └── com/example/cli/ └── Main.kt关键规则:一个模块——一个职责。不要将业务逻辑和基础设施混合在同一个模块中。这简化了测试和代码复用。
2. 为单一代码库配置Gradle
我们从根文件settings.gradle.kts开始。它定义了哪些模块属于项目:
// settings.gradle.ktsrootProject.name = "my-monorepo"
include(":shared")include(":backend")include(":cli-tool")
// 可选:可以通过include()设置模块名称// include(":libs:utils") — 如果模块嵌套在libs文件夹中现在是根build.gradle.kts。它通常只包含公共设置(插件、仓库),没有自己的代码:
// build.gradle.kts (根)plugins { kotlin("jvm") version "1.9.22" apply false id("application") apply false}
allprojects { repositories { mavenCentral() }}
subprojects { apply(plugin = "kotlin") // 所有子项目的公共设置 dependencies { implementation(kotlin("stdlib")) }}注意apply false——这可以防止插件应用于根项目。每个模块自行决定需要哪些插件。
3. 模块示例:公共库(shared)
shared模块将包含可复用的函数。它的build.gradle.kts:
// shared/build.gradle.ktsplugins { kotlin("jvm")}
dependencies { // 没有内部依赖——这是一个基础模块 testImplementation("org.jetbrains.kotlin:kotlin-test")}Utils.kt中的代码:
// shared/src/main/kotlin/com/example/shared/Utils.ktpackage com.example.shared
fun greet(name: String): String = "Hello, $name!"
fun add(a: Int, b: Int): Int = a + b现在这个模块可以连接到其他模块:
// backend/build.gradle.ktsplugins { kotlin("jvm") id("application")}
dependencies { implementation(project(