11.1.4 Gradle 最佳实践
4 分钟阅读
原文链接: https://kotlinlang.org/docs/gradle-best-practices.html
11.1.4 Gradle 最佳实践
Gradle 是许多 Kotlin 项目用来自动化和管理构建过程的构建系统。
充分利用 Gradle 非常关键,它能帮你减少管理和等待构建的时间,把更多时间用于编码。这里我们提供一组最佳实践,分为两个关键方面:组织和优化你的项目。
组织
本节重点介绍如何组织 Gradle 项目结构,以提高清晰度、可维护性和可扩展性。
使用 Kotlin DSL
使用 Kotlin DSL 而不是传统的 Groovy DSL。这样你就不必再学习另一门语言,同时还能获得严格类型检查的好处。严格类型让 IDE 能更好地支持重构和自动补全,从而提高开发效率。
更多信息请参阅 Gradle 的 Kotlin DSL 入门。
阅读 Gradle 关于 Kotlin DSL 成为 Gradle 构建默认选择的那篇博客。
使用版本目录
使用 libs.versions.toml 文件中的版本目录来集中管理依赖。这样你就可以在各项目之间一致地定义和复用版本、库和插件。
| |
并在你的 build.gradle.kts 文件中加入以下依赖:
| |
在 Gradle 文档的依赖管理基础中了解更多。
使用约定插件
高级
使用约定插件来封装并复用多个构建文件中的公共构建逻辑。把共享配置移到插件中,有助于简化和模块化你的构建脚本。
虽然初始设置可能比较耗时,但完成之后维护和添加新的构建逻辑就很容易了。
在 Gradle 文档的约定插件中了解更多。
优化
本节提供提升 Gradle 构建性能与效率的策略。
使用本地构建缓存
使用本地构建缓存,通过复用其他构建产生的输出来节省时间。构建缓存可以取用你已经创建过的任何更早构建的输出。
在 Gradle 文档的构建缓存中了解更多。
使用配置缓存
注意: 配置缓存目前尚未支持所有 Gradle 核心插件。最新信息请参阅 Gradle 的受支持插件表。
使用配置缓存,通过缓存配置阶段的结果并在后续构建中复用来显著提升构建性能。如果 Gradle 检测到构建配置或相关依赖没有变化,就会跳过配置阶段。
配置缓存还支持在单个项目内并行执行相互独立的任务,这可以进一步提升构建性能。此外,它会隐式启用 org.gradle.parallel 属性,让不同项目中的任务可以并行执行。
在 Gradle 文档中进一步了解配置缓存。
缩短多目标的构建时间
当你的多平台项目包含多个目标时,build 和 assemble 这类任务可能会为每个目标重复编译同一份代码,导致编译时间更长。
如果你正在针对某个特定平台积极开发和测试,请改为运行对应的 linkDebug* 任务。
更多信息请参阅缩短编译时间的技巧。
从 kapt 迁移到 KSP
如果你使用的库依赖 kapt 编译器插件,请检查是否可以改用 Kotlin Symbol Processing (KSP) API。KSP API 通过减少注解处理时间来提升构建性能。KSP 比 kapt 更快、更高效,因为它直接处理源代码,而不生成中间的 Java 桩文件。
关于迁移步骤的指导,请参阅迁移指南。
使用模块化
高级
注意: 模块化只对中等规模及以上的项目有益。对于基于微服务架构的项目,它不会带来优势。
使用模块化的项目结构来提升构建速度并便于并行开发。把你的项目组织为一个根项目和一个或多个子项目。如果改动只影响其中一个子项目,Gradle 只会重新构建那个特定的子项目。
.
└── root-project/
├── settings.gradle.kts
├── app subproject/
│ └── build.gradle.kts
└── lib subproject/
└── build.gradle.kts
在 Gradle 文档的用 Gradle 组织项目结构中了解更多。
搭建 CI/CD
高级
搭建 CI/CD 流程,通过增量构建和缓存依赖来显著缩短构建时间。添加持久化存储或使用远程构建缓存即可获得这些好处。这个过程不必很耗时,因为有些服务商(例如 GitHub)几乎开箱即用地提供该服务。
浏览 Gradle 社区手册中关于在持续集成系统中使用 Gradle的内容。
使用远程构建缓存
高级
与本地构建缓存类似,远程构建缓存通过复用其他构建的输出来帮你节省时间。它可以取用任何人运行过的任何更早构建的任务输出,而不只是最近一次。
远程构建缓存使用缓存服务器在不同构建之间共享任务输出。例如,在带 CI/CD 服务器的开发环境中,服务器上的所有构建都会填充远程缓存。当你检出主分支开始开发新特性时,就能立即获得增量构建的好处。
请记住,网络连接较慢时,传输缓存结果可能比在本地运行任务更慢。
在 Gradle 文档的构建缓存中了解更多。