如何使用 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 框架

如何将 java 库添加到 kotlin 本机

如何在 kotlin native 中使用 swift 库?

Kotlin/Native IDE支持预览

是否有 kotlin native 的 web 框架

如何避免“附加到使用 kotlin/native 编译器编译的项目的库”错误?