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

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

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

开始课程

使用Kotlin的单一仓库:代码组织与最佳实践



随着项目规模的增长和服务数量的增加,开发者面临一个问题:如何组织代码使其保持可管理、易于测试且能快速部署?一种流行的解决方案是单一仓库(monorepo)。本文将探讨如何使用Gradle高效组织Kotlin单一仓库,介绍应采用的工具和模式,以及如何避免常见错误。



什么是单一仓库及其必要性?



单一仓库是一种将多个项目(模块、库、服务)的代码存储在同一个仓库中的方法。在Kotlin环境中,这意味着您可以拥有一个包含后端服务、Android应用、公共库甚至文档模块的Gradle项目。



单一仓库的优势:

  • 统一版本管理 — 所有模块使用相同版本的Kotlin和公共依赖。
  • 简化重构 — 公共库的变更对所有使用者立即可见。
  • 统一CI/CD配置 — 所有模块共享同一个流水线。
  • 增强协作 — 开发者可查看整个项目的代码。


但单一仓库需要纪律性:若组织不当,可能演变成依赖关系混乱的"单体"。Kotlin和Gradle为此提供了优秀的工具。



Kotlin单一仓库的结构



考虑一个包含Ktor后端服务、数据模型公共库和Android应用的典型项目结构:



my-monorepo/├── build.gradle.kts          # 根构建文件├── settings.gradle.kts       # 模块引入配置├── gradle.properties         # 公共版本配置├── common/│   ├── build.gradle.kts│   └── src/│       └── main/kotlin/│           └── com/example/common/│               └── Models.kt├── backend/│   ├── build.gradle.kts│   └── src/│       └── main/kotlin/│           └── com/example/backend/│               └── Application.kt├── android-app/│   ├── build.gradle.kts│   └── src/│       └── main/kotlin/│           └── com/example/android/│               └── MainActivity.kt└── ci/    └── build.sh


settings.gradle.kts文件引入模块:



rootProject.name = "my-monorepo"

include(":common")include(":backend")include(":android-app")


根build.gradle.kts通常只包含公共插件和配置:



plugins {    kotlin("jvm") version "1.9.22" apply false    kotlin("android") version "1.9.22" apply false    id("org.jetbrains.kotlin.plugin.serialization") version "1.9.22" apply false}

allprojects { group = "com.example" version = "1.0.0"}


重要提示:插件使用apply false声明,使其不应用于根项目,但可供子模块使用。



单一仓库中的依赖管理



主要目标之一是避免依赖版本重复。为此可使用Gradle Version Catalog(gradle文件夹中的libs.versions.toml文件)。示例:



# gradle/libs.versions.toml[versions]kotlin = "1.9.22"ktor = "2.3.7"coroutines = "1.7.3"

[libraries]ktor-server-core = { module = "io.ktor:ktor-server-core", version.ref = "ktor" }ktor-server-netty = { module = "io.ktor:ktor-server-netty", version.ref = "ktor" }kotlinx-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }

[plugins]kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.

博客

书籍推荐