Kotlin Multiplatform--02:项目结构进阶
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)}}
}
现在项目结构树如下所示: