使用 Kotlin DSL 进行依赖管理

有很多关于如何配置项目以使用 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 BalintKotlin 的 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 版本、应用程序详细信息以及不同构建类型(如debugreleaseproduction.

实际操作

将依赖项从 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 设置项目

  1. 创建 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342