【问题标题】:How Do Transitive Dependencies in KMM and iOS work?KMM 和 iOS 中的传递依赖是如何工作的?
【发布时间】:2022-01-12 21:57:39
【问题描述】:

假设我有一个包,共享包,它与两个 KMM 项目共享:KMM 项目 A 和 KMM 项目 B。

所以我们有共享包 -> KMM 项目 A 和共享包 -> KMM 项目 B。

现在我想在我的 iOS 应用程序中同时使用 KMM 项目 A 和 KMM 项目 B。这是如何运作的?共享包是否与两个框架捆绑在一起(即我包含两次相同的依赖项?)。此外,共享包是否需要是 KMM 项目才能允许 KMM 项目 A 和 B 生成相关的 iOS 框架?或者它可以是一个纯粹的 Kotlin 项目吗?

这是一张图表,可以对我试图理解的情况提供更多解释。

【问题讨论】:

    标签: kotlin kotlin-multiplatform kmm


    【解决方案1】:

    您需要一个依赖于 KMM 项目 A 和 KMM 项目 B 的包装“unbrella”模块,并让它生成您的 Xcode 框架。

    从技术上讲,您可以生成 2 个框架,一个用于 KMM 项目 A 和 B,但它们都将具有“共享包”的副本,以及 Kotlin 标准库的相关部分,最重要的是,这 2 个框架在二进制级别上是不同的,因此它们无法通信。

    我的意思是,如果“共享包”有一个data class Foo,并且您通过调用“KMM 项目 A”得到它,比如fun makeAFoo():Foo,并且您在“KMM 项目”中有一个函数B" 定义为fun takeAFoo(foo:Foo),你从makeAFoo()得到的Foo实例不能传递给takeAFoo(foo:Foo)

    所以,简短的回答是您需要一个包装器模块来拉入两个“共享包”模块。您还需要通过保护伞导出它们。

    请参阅:https://touchlab.co/multiple-kotlin-frameworks-in-application/https://kotlinlang.org/docs/mpp-build-native-binaries.html#export-dependencies-to-binaries

    【讨论】:

    • 这就是我认为我需要去的方向,谢谢你的链接!在上述情况下,共享包是否也需要是一个 KMM 库以允许使用 KMM 项目生成正确的 iOS 二进制文件?或者它可以是一个纯 kotlin 库,并在 KMM 项目 A 和 B 的 commonMain 模块中使用?
    • 您需要将 iOS 目标添加到“共享包”中,但是您可以只使用通用源集而不添加任何特定于平台的代码。不过,它需要是 KMM 并添加目标。
    猜你喜欢
    • 2021-09-19
    • 2023-01-30
    • 2018-04-28
    • 1970-01-01
    • 2021-09-09
    • 2021-07-26
    • 2018-07-06
    • 1970-01-01
    相关资源
    最近更新 更多