Kotlin单体仓库:代码组织的实践
在现代软件开发中,越来越多地面临单体仓库(monorepo)和多仓库(multirepo)之间的选择。对于Kotlin项目,特别是那些使用Kotlin Multiplatform或微服务架构的项目,单体仓库成为一个强大的工具。在本文中,我们将探讨如何在Kotlin单体仓库中正确组织代码,介绍实际示例和最佳实践,帮助您避免常见错误。
什么是单体仓库,为什么Kotlin需要它?
单体仓库是一种将所有项目代码(或多个相关项目的代码)存储在一个仓库中的方法。在Kotlin的上下文中,这可以包括:
- 公共库 — 工具类、数据模型、DTO。
- 应用程序模块 — 后端(Ktor、Spring)、前端(Kotlin/JS)、移动应用(Kotlin Multiplatform)。
- 脚本和配置 — CI/CD、Dockerfile、Gradle脚本。
Kotlin项目使用单体仓库的主要优势:
- 统一的依赖版本 — 所有模块使用相同版本的Kotlin和库,降低冲突风险。
- 简化的重构 — 一个模块中的API更改会立即在所有依赖模块中可见。
- 更容易配置CI/CD — 所有组件使用一个流水线。
- 透明性 — 整个代码库在一个地方可用。
但也有缺点:仓库大小可能增长,克隆时间增加。但对于中型和大型Kotlin项目,单体仓库通常是最佳解决方案。
单体仓库结构:实用模板
正确的文件夹组织是成功的基础。让我们看看使用Gradle的Kotlin项目的典型结构:
my-kotlin-monorepo/├── build.gradle.kts # 根构建脚本├── settings.gradle.kts # 模块配置├── gradle.properties # 通用Gradle参数├── gradle/│ └── libs.versions.toml # Version Catalog(推荐)├── modules/│ ├── common/ # 公共工具和模型│ │ ├── build.gradle.kts│ │ └── src/│ ├── backend/ # 基于Ktor的后端服务│ │ ├── build.gradle.kts│ │ └── src/│ ├── android-app/ # Android应用│ │ ├── build.gradle.kts│ │ └── src/│ └── web-client/ # Kotlin/JS客户端│ ├── build.gradle.kts│ └── src/├── scripts/ # 辅助脚本│ └── deploy.sh└── docs/ # 文档 └── architecture.mdsettings.gradle.kts文件引入模块:
rootProject.name = "my-kotlin-monorepo"
include(":modules:common")include(":modules:backend")include(":modules:android-app")include(":modules:web-client")在根build.gradle.kts中可以设置通用插件和依赖:
plugins { kotlin("jvm") version "1.9.22" apply false kotlin("multiplatform") version "1.9.22" apply false id("com.android.application") version "8.2.0" apply false}依赖管理:Version Catalog和Convention Plugins
在单体仓库中,避免依赖版本重复至关重要。为此,Kotlin使用Version Catalog(libs.versions.toml文件)。
gradle/libs.versions.toml示例:
[versions]kotlin = "1.9.22"ktor = "2.3.7"coroutines = "1.8.0"
[libraries]kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }ktor-server-core = { module = "io.k