Kotlin Multiplatform--02:項目結構進階
- 引言
- 正文
引言
????????在上一章中,我們對 Kotlin Multiplatform 項目有了基本的了解,已經可以進行開發了。但我們只是使用了系統默認的項目結構。本章介紹了如何進行更復雜的項目結構管理。
正文
????????在上一章中,我們知道正常情況下,平臺相關的代碼能直接調用 Common Code,但 Common Code 不能直接調用平臺相關代碼,不同平臺之間也是不能互相調用的。即如下關系:
????????但有時候我們希望進一步細分,比如同為 ios 也有 iosArm64 和 iosSimulatorArm64 之分,此時我們需要在 build.gradle.kts 中的 sourceSets 用到 dependsOn。
????????dependsOn 用來連接兩個不同的 kotlin source sets,一般是用來連接 Common Code 和平臺相關代碼。假設現在有兩個 kotlin source sets A 和 B,現有表達式 A.dependsOn(B) ,含義如下:
????????1、A 可以獲取 B 中的 API 及其內部聲明。
????????2、A 可以為 B 中的 expect 函數提供 actual 實現。
????????3、B 需要支持所有 A 支持的 Targets。
????????4、A 繼承所有 B 的依賴庫。
????????舉個例子,現有依賴關系:iosArm64 和 iosSimulatorArm64 都 dependsOn iosMain,而 iosMain 和 androidMain 又 dependsOn commonMain,那么它們之間的關系如下圖所示:
????????上述這些都是系統內置的 sourceSets 其實我們也可以自定義 sourceSets,如下所示:
kotlin {jvm()js()linuxX64()sourceSets {// Create a source set named "jvmAndJs"val jvmAndJsMain by creating {// …}}
}
????????我們聲明了一個名為 jvmAndJsMain 的自定義 sourceSets,如下圖所示:
????????現在 jvmAndJsMain 是獨立于項目結構樹的,我們需要將其加到項目結構樹中去:
kotlin {jvm()js()linuxX64()sourceSets {val jvmAndJsMain by creating {// Don't forget to add dependsOn to commonMaindependsOn(commonMain.get())}jvmMain {dependsOn(jvmAndJsMain)}jsMain {dependsOn(jvmAndJsMain)}}
}
????????現在項目結構樹如下所示: