gradle 在Kotlin多平台中,是否可以在一些不同的平台目标之间共享一个公共模块?

yrdbyhpb  于 2023-03-18  发布在  Kotlin
关注(0)|答案(1)|浏览(163)

我有一个项目,它有一个Android客户端和一个后端。它们共享公共代码(主要是通信模型)。目前这是使用Gradle模块实现的。
现在我想添加一个桌面客户端。这将与Android客户端共享一些UI代码和逻辑。这似乎是Kotlin多平台的用例。有一个使用KMP设置后端客户端的示例。我想我的目标如下:

  • 通用//客户端和后端共享的代码
  • jvm(“后端”)
  • 公共客户端//客户端共享的代码
  • jvm(“桌面客户端”)
  • 安卓

但是我还没有找到一种方法来定义这样的Common-client目标。有办法吗?KotlinMultiplatform是不是错误的方法?
注:这与this question不同,因为公共模块不是用于同一平台的两个目标,而是用于不同平台。

az31mfrm

az31mfrm1#

请注意,本文中的“相同/不同”平台是由Kotlin定义的,在直观层面上表示“相同的二进制格式”,这意味着目前只有“JVM平台”(无所谓,Android、桌面或后端)、“JS平台”和“本机平台”。
因此,直接回答您的问题是使用您所链接的问题中的答案,即下面所描述的:https://kotlinlang.org/docs/multiplatform-set-up-targets.html#distinguish-several-targets-for-one-platform
此外,请确保熟悉层次结构:https://kotlinlang.org/docs/multiplatform-hierarchy.html为了创建“common-client”,即源集合,在部分(而非全部)声明的目标之间共享,您将需要它。
话虽如此,请注意,此配置仍然不稳定(https://youtrack.jetbrains.com/issue/KT-28194/Support-of-backend-shared-source-sets-in-Kotlin-Multiplatform),虽然它在一般功能上是可用的,但要为工具支持中的一些粗糙边缘和处理依赖项时的不愉快意外做好准备。
请注意,除非您有非常高级的案例,否则如果您使用Gradle Projects而不是KotlinSource Sets来对共享进行建模,就可以愉快地避免所有这些麻烦。因为您的所有目标都是JVM,所以您很有可能在所有目标中只使用kotlin("jvm")(显然,Android-client除外)。
例如,desktop-clientbuild.gradle.kts将如下所示:

// desktop-client/build.gradle.kts
plugins {
    kotlin("jvm")
}

dependencies {
    api(project(":client-common"))
}

这就是client-common的build.gradle.kts的样子:

plugins {
    kotlin("jvm")
}

dependencies {
    api(project(":common"))
}

等等。

相关问题