如何使用 Kotlin/native 生成依赖于另一个的 .framework?
Posted
技术标签:
【中文标题】如何使用 Kotlin/native 生成依赖于另一个的 .framework?【英文标题】:How to generate a .framework depending from another with Kotlin/native? 【发布时间】:2021-07-27 21:18:48 【问题描述】:我在 KMP 和 ios 框架方面存在一些依赖问题。
这里有一些上下文: 我有 2 个 KMP 模块:
API 模块:仅定义接口 一个经典的 lib 使用 API 模块作为注入我还有 2 个 android 项目和 2 个 iOS 项目:
Android 和 iOS 应用程序(使用 KMP ClassicLib) 实现 API 模块的 Android 和 iOS 库在 Android 上,我有以下内容:
// KMP API project
public interface Foo
// KMP libA project
public class Bar
fun doSomething(foo: Foo)
// ANDROID: libB project
import API
public class FooImpl: Foo
// ANDROID app
import libA
import libB
var foo = FooImpl()
var bar = Bar()
bar.doSomething(foo) // <----- Everything is fine here
但在 iOS 上,我有这个:
// iOS app
import libA
import libB
var foo = FooImpl()
var bar = Bar()
bar.doSomething(foo) // <----- Error here : FooImpl is of type APIFoo but here LibAAPIFoo is excpected
确实,当我查看生成的标头时,我有以下内容:
// KMP API.h
@protocol APIFoo
@end;
// KMP libA.h
@protocol LibAKAFoo // <----- here we have a redefinition of the protocol.
@end;
@interface Bar
- (void)doSomething:(KMPKAFoo)foo;
@ends;
我期待有更多类似的东西:
// KMP API.h
@protocol APIFoo
@end;
// KMP libA.h
#include <API/API.h> // <----- import the API
@interface Bar
- (void)doSomething:(APIFoo)foo; // <----- use it
@ends;
我的 build.gradle 中是否缺少特殊配置?
我尝试在依赖项定义中使用compileOnly
,但它没有效果并且与implementation
具有相同的行为
val commonMain by getting
dependencies
compileOnly("com.poc.sample:KMPAPI:0.0.1")
【问题讨论】:
【参考方案1】:您不能创建多个 Kotlin iOS 框架并在同一个项目中互换使用它们。当 Kotlin 编译器创建一个 iOS 框架时,它就是它的“自己的世界”,因为它包含了您需要的一切(依赖项等)。这是一个大的二进制文件。
总结是,你想要的配置是不可能的。您可以在同一个项目中使用多个 Kotlin iOS 框架,但它们需要完全独立。他们将无法相互交流。
【讨论】:
真的很清楚!谢谢你的回答! 有没有关于这个规则的文件?实际上我已经构建了一个嵌套的 kmm 模块项目,每个项目都可以在 XCode 中访问。 touchlab.co/multiple-kotlin-frameworks-in-application以上是关于如何使用 Kotlin/native 生成依赖于另一个的 .framework?的主要内容,如果未能解决你的问题,请参考以下文章
在 Cocoapod 中导入 Kotlin/Native 框架