Как сгенерировать .framework в зависимости от другого с помощью Kotlin/native?

У меня есть проблемы с зависимостями с KMP и iOS Framework.

Вот некоторый контекст: у меня есть 2 модуля KMP:

  • Модуль API: определение только интерфейсов
  • Классическая библиотека, использующая модуль API как инъекцию

У меня также есть 2 проекта для Android и 2 проекта для iOS:

  • приложение для Android и iOS (использующее KMP ClassicLib)
  • библиотека для Android и iOS, реализующая модуль API

На 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 в одном проекте, но они должны быть полностью независимыми. Они не смогут общаться друг с другом.

Другие вопросы по тегам