Kotlin Типы интерфейса мультиплатформенной библиотеки не разрешены - PullRequest
1 голос
/ 09 января 2020

У нас есть многомодульный android проект, который мы начали реорганизовывать в kotlin -мультиплатформенный проект с несколькими модулями, чтобы поделиться с нашим приложением iOS.

Наш мультиплатформенный проект в настоящее время имеет 4 модуля: домен, презентация, данные и shared-приложение. Модуль shared-app зависит от трех других модулей, и этот модуль импортируется в старый проект android. Мы объединяем модули в один, чтобы создать только одну платформу для проекта iOS.

Оба проекта успешно собраны. Но если мы получим экземпляр интерфейса, который определен в модуле shared-app, который использует типы из подмодулей, IDE покажет [ERROR: SomeType] для своих типов возврата.

enter image description here

В наших старых android проектах settings.gradle мы использовали includeBuild (mpp-project) и создали замену зависимостей для общего приложения модуль в проекте mpp.

enableFeaturePreview("GRADLE_METADATA")

includeBuild("mpp-project") {
    dependencySubstitution {
        substitute(module("our.package.name:shared")).with(project(":shared-app"))
    }
}

С другой стороны, все наши открытые и транзитивно импортированные типы могут быть созданы в старом проекте android, даже из подмодулей. (например, я могу установить SomeType, и он разрешается)

Структура проекта Gradle:

oldAndroidRootProject
├─myApp (import implementation of all androidModules and mppFramework)
│  └─build.gradle
├─androidModule1
│  └─build.gradle
├─androidModule2
│  └─build.gradle
├─androidModule3
│  └─build.gradle
│
├─myMppRootProject
│   ├─mppFramework (depends on mppModuleXs and dependencies are declared as api(":mppModuleX"))
│   │   └─build.gradle
│   ├─mppModule1
│   │   └─build.gradle
│   ├─mppModule2
│   │   └─build.gradle
│   ├─mppModule3
│   │   └─build.gradle
│   ├─mppModule4
│   │   └─build.gradle
│   ├─build.gradle
│   └─settings.gradle (uses includeBuild("myMppRootProject"))
├─build.gradle
└─settings.gradle (uses includeBuild("myMppRootProject"))

Если я проверяю источник модулей mppFramework, когда был открыт проект androidRoot, я см. это:

enter image description here

1 Ответ

1 голос
/ 10 января 2020

Если я могу перефразировать:

   -------
   - ios -
   -------
      |
   ----------
   - shared - ---------
   ----------          \
       |      \         \
   -------- ---------- ----------------
   - data - - domain - - presentation -
   -------- ---------- ----------------

Если shared является единственной точкой входа, она должна раскрывать зависимые типы через заголовок. Сложность такого рода вещей в том, что вам нужно что-то, скажем, от domain, которое не включено в вызов publi c в shared. Если это не случай, то то, что вы делаете, должно работать.

Было бы полезно, если бы вы опубликовали конфигурацию сборки, чтобы мы могли видеть, как настроены зависимости. Кроме того, это работает в командной строке? Иногда IDE не работает, но сборка в порядке.

Кроме того, это Intellij или Android Studio и какая версия? Intellij имеет тенденцию быть более современным в отношении KMP.

...