#kotlin #kotlin-multiplatform #kmm
#kotlin #kotlin-мультиплатформенный #kmm
Вопрос:
Допустим, у меня есть пакет, общий пакет, который используется совместно с двумя проектами KMM: KMM Project A и KMM Project B.
Итак, у нас есть общий пакет -> KMM Project A и общий пакет -> KMM Project B.
Теперь я хочу использовать как KMM Project A, так и KMM Project B в своем приложении для iOS. Как это работает? Является ли общий пакет в комплекте с обеими фреймворками (т. Е. Я включаю одну и ту же зависимость дважды?). Кроме того, должен ли общий пакет быть проектом KMM, чтобы позволить проектам KMM A и B генерировать соответствующие фреймворки iOS? Или это может быть чистый проект Kotlin?
Вот диаграмма, которая может дать больше объяснений ситуации, которую я пытаюсь понять.
Ответ №1:
Вам нужен модуль-оболочка «unbrella», который зависит от KMM Project A и KMM Project B, и который генерирует ваш фреймворк Xcode.
Технически вы можете сгенерировать 2 фреймворка, по одному для каждого проекта KMM A и B, но оба они будут иметь копию «общего пакета» вместе с соответствующими частями стандартной библиотеки Kotlin, и, что наиболее важно, эти 2 фреймворка будут различаться на двоичном уровне, поэтому они не могутобщайтесь.
Я имею в виду, что если у «общего пакета» есть a data class Foo
, и вы получаете это в результате вызова, скажем, «KMM Project A» fun makeAFoo():Foo
, и у вас есть функция в «KMM Project B», которая определена как fun takeAFoo(foo:Foo)
, Foo
экземпляр, который вы получаете makeAFoo()
, не может быть передан takeAFoo(foo:Foo)
.
Итак, короткий ответ: вам нужен модуль-оболочка, который использует оба модуля «общего пакета». Вам также нужно будет экспортировать их через umbrella.
Смотрите: https://touchlab.co/multiple-kotlin-frameworks-in-application/ и https://kotlinlang.org/docs/mpp-build-native-binaries.html#export-dependencies-to-binaries
Комментарии:
1. Я думал, что мне нужно будет идти в этом направлении, спасибо за ссылки! В приведенном выше случае общий пакет также должен быть библиотекой KMM, чтобы позволить потребляющему проекту KMM генерировать правильные двоичные файлы iOS? Или это может быть чистая библиотека kotlin и использоваться в
commonMain
модуле KMM Project A и B?2. Вам нужно будет добавить целевые объекты iOS в «Общий пакет», но затем вы можете просто использовать общие исходные наборы и не добавлять какой-либо специфичный для платформы код. Однако это должен быть KMM и обязательно добавлять цели.