Day 9: Kotlin DSL 管理杂乱依赖的好帮手

Keyword: Kotlin DSL
到Day9使用Kotlin DSL 管理依赖的Code放在
KMMDay9


集中管理依赖版本

在使用第三方库的时候,有时候可能同时使用到许多不同的模组,像是昨天的ktor就使用到了 core/ json /logging / okhttp 等等不同的Ktor模组.而在使用这些模组时,如果使用到了不同的版本,例如core更新到了2.3.1,而logging只有1.0.0,就有可能发生意料之外的错误,所以除了官方有明确说明可以混用,不然还是统一使用同一个版本号较为安全.

在以往只有一个Gradle档案管理依赖时,会在这个Gradle档案中使用version常数作为版本的管理,当要修改内容时只要修改这边即可.这也是业界常见的做法.

但是KMM由於跨平台的特性,所以KMM专案具有多个gradle各自为政,使用不同版本的依赖还是有发生问题的可能,这时把版本号放在各个gradle中就不是合适的做法了.

新人加入後可能只有改变其中一个gradle的版本号,而其他的部分忘记修改或是根本不知道其他部分有使用到.

最惨的是,专案表面上是看不出什麽异状的,要一直等到某天突然执行到这个情境.隐藏的地雷爆炸.才又花上大精力去补救.

好在Kotlin也有考虑到这个问题,我们可以使用Kotlin DSL功能 来进行版本的统一管理.

在Android Studio内,切换成专案页面,然後在专案的根目录建立一个名为buildSrc的路径

https://github.com/officeyuli/itHome2021/raw/main/day8/progject%20root.jpg

建立好之後在其中再增加一个名为build.gradle.kts的档案,并且填上Kotlin-DSL的依赖,有了这几行文字并编译後,Gradle就能认出来这是给Gradle使用的Kotlin DSL

plugins{
    `kotlin-dsl`
}

repositories {
    mavenCentral()
}

这时候gradle仍然认为这只是一般档案,所以请进行Gradle sync

之後就在这个路径底下,建立起src/main/java的路径,在里面建立起一个Dependencies.kt的档案,这边就是我们以後管理各个版本的区块

全部完成後,会像这样

https://github.com/officeyuli/itHome2021/raw/main/day8/Dependencieskt.jpg

然後把前几天写的Gradle引用逐渐搬进来这个新建立的档案,首先先抽出版本号,现在有用到的是Ktor与Kotlin serialization,将各gradle内的版本都集中起来

object Versions{
    val ktor = "1.6.3"
    val serialization_version = "1.5.21"
}

然後我们再建立一个Develop物件,里面放入Develop环境所使用的依赖,就像这样

object Develop{
    object Ktor{
        val commonCore = "io.ktor:ktor-client-core:${Versions.ktor}"
        val commonJson = "io.ktor:ktor-client-json:${Versions.ktor}"
        val commonLogging = "io.ktor:ktor-client-logging:${Versions.ktor}"
        val androidCore = "io.ktor:ktor-client-okhttp:${Versions.ktor}"
        val ios = "io.ktor:ktor-client-ios:${Versions.ktor}"
        val commonSerialization = "io.ktor:ktor-client-serialization:${Versions.ktor}"
    }
}

由於在实务上,有可能Develop环境与正式环境有不同的依赖,所以会独立开来写,这样在进行编译的时候就能使用到不同的参数.

如法炮制,把serialization的依赖也加入到Develop中,全部写完後记得再次Sync gradle

之後就能在其他的build.gradle中直接使用,使用的方法可以直接呼叫,非常方便,以shared内的gradle为例

...
sourceSets {
        val commonMain by getting {
            dependencies {
                implementation(Develop.Ktor.commonCore)
                implementation(Develop.Ktor.commonJson)
                implementation(Develop.Ktor.commonLogging)
                implementation(Develop.Ktor.commonSerialization)
                implementation(Develop.Coroutines.common)
            }
        }
...
}

如何,是不是清楚多了?并且需要更新时只要修改Dependencies内的数据,便会整个专案一起修改.

准备好所有工具後,我们明天正式开始写Ktor,来进行网路请求.


<<:  Day 02 - 动态调整的PM职涯规划(1)

>>:  Day02 - 安装 Docker

Day 9 k8s event收集-eventrouter

2021 铁人赛 DAY9 现在我们已经有收集了k8s的log、资源使用率,这样看起来还不错?那我们...

Day11 网页排版好朋友 - Flexbox

Flexbox的组成 Flexbox 是由外容器(flex container)与内元件(flex ...

Day 2 调整照片亮度

调整照片亮度 教学原文参考:调整照片亮度 这篇文章会介绍在 GIMP 使用「亮度 / 对比」、「曝光...

[Day 25] 交叉验证 Cross-Validation 简介

今日学习目标 常见的交叉验证方法 K-fold Leave one out cross valida...

Day 14:专案02 - PTT C_chat版爬虫01 | 爬虫简介、request和response、Requests

⚠行前通知 先前已经学过Python但想学爬虫的人可以回来罗~ 从今天起就开始大家最期待的网页爬虫的...