【发布时间】: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