Kotlin 单体仓库:代码组织实践

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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.md


settings.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

博客

书籍推荐