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