Keyword: KMM Gradle,Kotlinx serialization
到Day9使用Kotlin DSL 管理依賴的Code放在
KMMDay9
我們要進行網路請求,以往在iOS上可能使用Maya,Android上使用Retrofit居多.
但Retrofit與Maya都不能給另外一個平台使用,所以需要為了各平台去獨立寫一份網路請求的程式碼.
而在KMM這邊,藉由官方提供的網路框架Ktor,可以實現雙平台共用同一份Code,進而減少開發成本.
我們將要學習如何去使用Ktor,不過在這之前,必須先引入Ktor,而這其中也有不少的眉角
這是由JetBrain推出的框架Ktor,用於Web api開發與測試,而且Kotlin常用的Coroutine,DSL等等的特性,也有支援.利用Kotlin的跨平台特性,可以輕易地開發出不同版本使用.
對於我們Client端,也有特別開發出支援各Client端的支援,讓前後端都能在一個框架下進行溝通.
(在我剛開始學習KMM的時一直被官網的介紹所誤導,以為Ktor只有提供後端開發,
後來詢問Kotlin官方技術傳教士聖佑後,才了解到Client端也有一份專屬的內容)
要使用Ktor,就需要在Gradle內聲明依賴關係,如果是Android開發者應該對此熟悉.Gradle有許多功能,負責管理編譯流程,管理第三方庫使用,調整參數等等的.
這次主要是使用到依賴管理的功能.這也是gradle最常使用的部分
KMM的架構稍微複雜,在這個剛建起來的KMM專案內,build.gradle就有三個.分別是:
這三個Gradle負責管理不同的依賴,放錯位置可能會發生摸不著頭緒的問題.
以後會稱之為gradle(project) / gradle(shared) / gradle(android) 來分別代表這三個Gradle
要能夠成功使用ktor,這幾個gradle都需要做不同程度的修改,讓我們開始吧.
由於Ktor是使用在共用的網路請求,這個網路請求通常不會因為平台不同而改變,所以首要修改的就是shared內的gradle,讓雙平台一起共用的部分.找到gradle(shared)內的sourceSets.
sourceSets分別管理各區塊的依賴,commonMain / androidMain / iosMain分別對應著 共通 / android專用 / iOS專用
而如果在建立專案時有選擇"建立預設test檔案",還會多出commonTest/ androidTest/ iosTest,看名字就能知道分別是 共通測試 / android專用測試 / iOS專用測試
在不同的區塊設定補上以下內容,通常來說,如果和平台沒有關係的功能就會在common引入,而和平台實作有關係的就會分別到各平台的模塊中.
sourceSets{
val ktor_version = "1.6.3"
val commonMain by getting {
dependencies {
...
implementation("io.ktor:ktor-client-core:${ktor_version}" )
implementation("io.ktor:ktor-client-json:${ktor_version}")
implementation("io.ktor:ktor-client-logging:${ktor_version}")
...
}
}
...
val androidMain by getting {
dependencies{
...
implementation("io.ktor:ktor-client-okhttp:${ktor_version}")
...
}
}
...
val iosMain by getting {
dependencies{
...
implementation("io.ktor:ktor-client-ios:${ktor_version}")
...
}
}
}
(注意:預設專案有些部分的getting後面沒有大括弧,需要自己補上大括弧以及"dependencies"字眼)
除了網路請求的框架,我們還需要把網路請求的回傳轉換成object,一般來說是使用Gson比較多,不過這次我們換換口味,使用Kotlin官方推出的Kotlinx serialization進行解析,Kotlinx serialization 不僅支援多平台,完美符合我們的需求.且由於不是使用反射進行序列化,因此可以提供更快速的效能.甚至還能支援protobuff格式.
要使用到Kotlinx serialization 同樣的,也需要在多個地方修改
首先是整個專案的gradle(project),在buildScript內補上Kotlinx serialization的來源
buildscript {
repositories {
...
}
dependencies {
val serialization_version = "1.5.21"
...
classpath("org.jetbrains.kotlin:kotlin-serialization:$serialization_version")
}
}
再來是共通部分的gradle(shared),除了在共通部分加入的依賴以外,plugin的地方也要加入Kotlinx serialization的plugin,才能在編譯時產生對應物件.
plugins {
...
id("kotlinx-serialization")
...
}
sourceSets {
...
val ktor_version = "1.6.3"
...
val commonMain by getting {
dependencies {
...
implementation("io.ktor:ktor-client-serialization:${ktor_version}")
...
}
}
...
}
由於KMM的區塊相當多元,所以需要在不同的Gradle裡面放入不同的依賴,一開始的時候會搞不大清楚這個依賴要放在哪裡,但是只要根據依賴的作用,就能了解所需要修改的位置
今天先把基礎依賴建好了,但是實際上使用這樣會很難管理版本,尤其在專案變大,或是像KMM這樣有多平台的專案.就更為複雜.所以明天我們先學習如何使用Kotlin DSL來管理依賴