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的路径
建立好之後在其中再增加一个名为build.gradle.kts的档案,并且填上Kotlin-DSL的依赖,有了这几行文字并编译後,Gradle就能认出来这是给Gradle使用的Kotlin DSL
plugins{
`kotlin-dsl`
}
repositories {
mavenCentral()
}
这时候gradle仍然认为这只是一般档案,所以请进行Gradle sync
之後就在这个路径底下,建立起src/main/java的路径,在里面建立起一个Dependencies.kt的档案,这边就是我们以後管理各个版本的区块
全部完成後,会像这样
然後把前几天写的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,来进行网路请求.
2021 铁人赛 DAY9 现在我们已经有收集了k8s的log、资源使用率,这样看起来还不错?那我们...
Flexbox的组成 Flexbox 是由外容器(flex container)与内元件(flex ...
调整照片亮度 教学原文参考:调整照片亮度 这篇文章会介绍在 GIMP 使用「亮度 / 对比」、「曝光...
今日学习目标 常见的交叉验证方法 K-fold Leave one out cross valida...
⚠行前通知 先前已经学过Python但想学爬虫的人可以回来罗~ 从今天起就开始大家最期待的网页爬虫的...