有很多关于如何配置项目以使用 Kotlin DSL 的内容。我找不到能够广泛解释正在发生的事情以及我们正在做的事情背后的基本原则的内容,特别是对于那些正在职业发展并想要了解整个事情的人。本章的重点是为什么从我们的 Github 项目中获取一些快照。我们需要了解很多信息,包括构建过程、特定领域的语言、各种配置等等。我将专注于关键概念,以及它们如何相互关联。
目标
理论
- Grandle 和 Android 构建过程
- 用于依赖管理的 DSL 和 Kotlin DSL
动手
- 为 Android 项目设置 Kotlin DSL
- 使用 Kotlin DSL 管理依赖项
Gradle 和 Android 构建过程
Gradle
大多数项目涉及多个协同工作的工件和资源。然后将工件构建到在特定环境中运行的应用程序中。Gradle 是一个构建自动化工具,可以自动化软件构建过程,例如
- 编译
- 建造
- 打包
- 测试
- 部署到各种平台。
除此之外,它确保了构建过程中的高速性能和一致性,同时还允许开发人员自定义应用程序。
Gradle 致力于三个概念
- 项目 - 需要完成的工作,例如编译和部署。
- 任务 - 构建过程中的单个活动,例如创建 JAR 文件。
- 构建脚本 - 位于项目/模块根目录的文件,包含 Gradle 执行每个任务所需的工件。
Gradle 有一个非常强大的文档,你可以查看它。它用于大多数 Android 项目。
Android 构建过程
我们在 Android Studio 上编写的 Kotlin/Java 代码被转换为可以在不同的 android 设备上运行的版本。Gradle 是 Android 应用程序的构建工具。它使我们不想担心的事情自动化。Gradle 和 android 插件构成了 android 构建系统,使您可以轻松地构建独立于平台的项目,即您可以在 Android Studio、终端或远程服务器上构建。
下图改编自 Android 开发者网站,展示了构建过程。
构建 android 应用程序的大局是将应用程序构建到您签署和发布或测试的应用程序包 (AAB) 或应用程序包 (APK) 中。构建过程分三个阶段进行
- 源代码被转换为 DEX 文件。Android 运行时使用 ART、JIT、AOT 或 Dalvik 运行时。您可以从本文或官方文档中了解有关Android 运行时的更多信息
- 该应用程序被打包成 APK 或 AAB。我们在项目级构建 Gradle 中至少指定一种构建类型。
- 签名 - 打包程序使用所选的构建变体对应用程序进行签名。然后针对发布进行优化。
Gradle 使我们能够自定义应用程序的配置。这就是在项目中使用 Grade 的美妙之处。我们有余地以一种易于扩展项目的方式配置我们的依赖项。 用于依赖管理的 Gradle有关于依赖如何工作的强大文档,以帮助我们弄清楚如何有效地管理依赖。我们将探讨 Gradle 依赖管理的几个方面。
Android 项目依赖于各种库和模块配置,需要适当的管理。Gradle 在大多数 JVM 项目中使用 Groovy DSL 来自动化依赖管理。DSL 有一个内置的依赖管理过程,它会自动知道如何根据需要下载和提供依赖。但是,您需要声明依赖项以告诉 Gradle 从何处获取构建的依赖项。
您可以使用公共或私有存储库。我们用于 android 项目的两个常见公共存储库是 mavenCental 和 google 用于 Android 项目。根据组织偏好,还有其他几种声明依赖关系的方法。例如,如果您的依赖项位于文件目录中,则将资源定义为flatDir
对象并使用dirs("lib")
. 你也可以拥有一个mavenLocal
如果您对 Groovy 没问题,本教程是可选的。然而,大多数组织正在转向 Kotlin DSL 进行依赖管理。但什么是 DSL?
DSL
设计特定语言 (DSL) 是一种设计模式,它试图使代码具有表达性和流畅性,以便任何人都可以理解代码。DSL 本身就是一种编程语言,它提供更高级别的抽象来解决特定问题。在大多数场景中,我们使用 DSL 进行配置,因为它更容易理解。通过使用 DSL,您可以获得以下优势
- 揭示意图 - 您知道代码开箱即用的功能。我们希望花最少的时间在配置上,而将更多的时间花在解决我们的具体问题上。揭示意图使其更接近我们想要对代码执行的操作
- 一致性——我们希望我们的生产版本控制是集中的和一致的。Kotlin DSL 为我们提供了所有依赖项和版本的中心位置。
- Fluency - Kotlin DSL 更加流畅,在 Kotlin 中很容易表达。
- 我们还希望删除重复项,同时使用最少的代码行。
但是 DSL 并不局限于依赖管理。请记住 DSL 是一种设计模式,通常遵循面向语言的编程,重点是使代码优化并且即使对于非程序员也可读。CSS 是 DSL 的一个示例,它广泛用于设置 UI 元素的样式。但这超出了本教程的范围。您可以通过Tino Balint或Kotlin 的 12 天中的这个示例检查使用 DSL 和Lambdas
了解 Groovy DSL
对于希望通过 Groovy DSL 使用 Kotlin DSL 的开发人员来说,使用 Kotlin DSL 是可选的。Kotlin DSL 具有许多优点。
让我们偏离一下,看看 Groovy DSL 的主要组件
Android 构建系统的工作原理
我发现了解构建过程如何在幕后工作将有助于我们自定义构建过程。该settings.gradle
文件用于列出应用程序中的所有模块。对于我们的案例,我们有 3 个模块,应用程序、域和数据模块。
Gradle 插件知道如何构建您的项目,具体取决于您使用的依赖项。例如,如果你想将一个应用程序编译成一个 android 应用程序,我们使用 android 插件。
Gradle 通过使用任务进行操作,这些任务根据规范接受输入、处理和输出。Gradle 使用等级 DSL 进行配置。更改为 Kotlin DSL 很重要,因为这是大多数公司使用的。
Gradle 在项目级文件中解析 Gradle DSL并构建 AGP DSL 对象,build.gradle
例如BuildType``ApplicationExtension
该android.application
插件附带其 DSL 来配置应用程序属性,您可以在其中配置android
特定的构建参数,如 SDK 版本、应用程序详细信息以及不同构建类型(如debug
、release
和production
.
实际操作
将依赖项从 Groovy 转换为 Kotlin
让我们真正了解我们正在做的事情。从之前的教程中,我们有了多模块应用程序的骨架。
Kotlin 和 Groovy DSL 在我们如何声明工件方面非常不同。您需要注意的一些关键事项是:
Groovy 使用单引号,就像
classpath 'com.android.tools.build:gradle:7.0.3'
Kotlin 需要双引号,即classpath ("com.android.tools.build:gradle:7.0.4")
在 Groovy 中,buildTypes 是明确声明的,比如
但是在 Kotlin 中,大多数常见的 buidTypes 在默认情况下都是可用的,因此隐式定义如下
为 Kotlin DSL 设置项目
- 创建 buildSrc 转到项目的根目录,与数据、域和表示模块处于同一级别,并将其命名为 buildSrc。
在项目视图上,Right Click Github突出显示New然后Directory命名buildSrc
buildSrc 将包含您项目的构建信息。正是在这个文件中,我们告诉项目使用 Kotlin DSL。该文件夹还将包含我们可以在不同模块之间共享的信息,例如版本和库。它抽象了命令式逻辑并帮助我们维护复杂的构建逻辑。
当 Gradle 发现 buildSrc 文件夹时,它会自动将该文件夹添加到 build 文件夹中,对该文件夹进行编译和测试,并将其添加到 build 脚本所在的类路径中。它给了我们帮助
有一个专用文件来声明依赖项
轻松重构依赖关系
轻松测试依赖关系
从一个地方维护依赖关系
启用 Kotlin DSL 要实现上述目的,我们需要启用 Kotlin DSL。在 buildSrc 的根目录下创建一个文件并将其命名build.gradle.kts如下所示。
构建项目。
如果您是第一次从 Groovy DSL 迁移到 Kotlin DSL,请确保每次进行更改时都构建项目。
此时,Gradle 知道我们将使用 Kotlin 进行依赖管理。
将文件从 Groovy 转换为 Kotlin
在开始向文件添加更多依赖项之前,我们需要更改现有文件
settings.gradle
- 将文件重命名settings.gradle为settings.gradle.kts
- 用双引号替换单引号并添加括号。
- 构建项目。
最终的设置文件将如图所示。
项目级 Gradle 构建
- 将文件名重命名build.gradle为build.gradle.kts
- 用双引号替换单引号并添加括号如图
- 同步并构建项目
- 编辑任务寄存器。
- 确保所有 URL 如下所示
模块级 Gradle
演示插件
- 将文件名从 更改build.gradle为build.gradle.kts
- 用双引号替换单引号并添加括号如图
Android
- 将值更改为函数,将字符串更改为属性调用
- 对于函数,将它们添加到括号中,对于值,使用等号
构建类型
- 某些构建类型默认可用,例如发布和调试
- 对于 minify,我们调用isMinifyEnabled函数
- 对于 Proguard,我们调用getDefaultProguardFile函数
添加如下图
更新域和数据模块。
确保每次更改文件后项目都能编译。
集中依赖关系
现在我们已经成功迁移到 Kotlin,下一步是集中依赖和版本。我们还将添加项目所需的大部分依赖项。
您可以将该项目用作项目的模板。
在 buildSrc 文件夹中创建一个 Kotlin 目录。转到New=> Directory=>src/main/kotlin
在新目录中创建四个 Kotlin 对象文件。在这里,您可以选择如何组织文件。就我而言,我有四个文件
- Config.kt包含主要配置信息的文件,如构建插件、android 工件版本、Gradle 插件和构建类型。
- Versions.kt文件,其中包含项目中所有库和依赖项的版本。为简单起见,我省略了大部分依赖项和版本。
- Modules.kt包含模块的文件
- Dependencies.kt它具有项目的所有库依赖项。
现在更新 Gradle 文件以使用 buildConfig 文件夹中的依赖项和配置文件。
项目级配置变为
演示级插件
这些是一些依赖项
来源:https://ciox.hashnode.dev/dependency-management-using-kotlin-dsl