KMM 和 iOS 中的传递依赖性如何工作?

How Do Transitive Dependencies in KMM and iOS work?

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

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

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

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

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

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

我的意思是,如果“共享包”有一个 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/ and https://kotlinlang.org/docs/mpp-build-native-binaries.html#export-dependencies-to-binaries