【问题标题】:Kotlin multiplatform library interface's exposed types not resolvedKotlin 多平台库接口的暴露类型未解析
【发布时间】:2020-01-09 15:49:37
【问题描述】:

我们有一个多模块的 android 项目,我们开始将其重构为一个 kotlin-multiplatform 项目,其中包含多个模块以与我们的 iOS 应用程序共享。

我们的多平台项目目前有 4 个模块:域、演示文稿、数据和共享应用程序。 shared-app 模块依赖于其他三个模块,这是导入到旧 android 项目中的模块。我们将这些模块合并为一个,只为 iOS 项目生成一个框架。

两个项目都成功构建。但是,如果我们检索一个在共享应用程序模块中定义的接口实例,该模块使用子模块中的类型,IDE 会显示 [ERROR : SomeType] 的返回类型。

在我们旧的 android 项目 settings.gradle 中,我们使用了 includeBuild(mpp-project) 并为 mpp-project 中的共享应用模块创建了一个依赖替换。

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 项目时,我会看到:

【问题讨论】:

  • 我刚刚在问题跟踪器上发现了一个问题,这可能会导致这种行为:youtrack.jetbrains.com/issue/KT-30285
  • 对于临时解决方法,我们创建了一个单独的模块,它将所有源文件合并到一个胖模块中,但我们真的想保留我们模块化的 mpp 项目,所以这只是一个临时的 hack。

标签: android gradle kotlin multi-module kotlin-multiplatform


【解决方案1】:

如果我能解释一下:

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

如果shared 是单入口点,它应该通过标头公开依赖类型。这种东西的棘手部分是当你想要来自domain 的东西时,它不包含在共享的公共调用中。如果不是,那么你正在做的事情应该会奏效。

如果您发布构建配置会很有帮助,这样我们就可以看到依赖项是如何配置的。另外,这在命令行上有效吗?有时 IDE 不工作,但构建正常。

另外,这是 Intellij 还是 Android Studio,什么版本? Intellij 在 KMP 方面往往是最新的。

【讨论】:

  • iOS 框架构建完美,问题仅在于 Android 构建。我已将项目结构添加到原始问题中。如果我在 IntelliJ 或 AS 中打开 mppProject 并成功同步并构建,则一切都已解决。但是,如果我打开根 android 项目,它将显示 mpp 项目及其模块,那么如果我检查 mppFramework 的源,它将突出显示为红色,并且 mppModule 引用都是红色的。此外,mppModules的依赖可以从android app模块中获取,但是mppFramework的接口都是未解析的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-14
  • 1970-01-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多