1

以前,使用 Gradle 构建多平台项目依赖于每个目标平台的单独 Gradle 插件:kotlin-platform-commonkotlin-platform-jskotlin-platform-jvm.

从 Kotlin 1.3 开始,现在统一使用一个kotlin-multiplatform插件。当前文档指定了如何使用这种方法设置多平台项目

但是,在我的项目中,我有多个多平台项目,它们之间存在一些依赖关系。使用旧的多平台配置,每个不同的平台都是一个单独的模块,并且在项目之间添加依赖项需要将每个特定于平台的模块中的项目引用添加到另一个项目中的相应模块:例如,project(':some-library:some-library-js')从另一个 JS 中添加对 JS 模块的依赖项模块。

在迁移到新的多平台配置时,我现在需要将使用旧配置方法配置的项目的依赖项添加到使用新kotlin-multiplatform插件配置的项目中。

鉴于平台特定的模块现在由新插件指定和管理,我该怎么做?

4

2 回答 2

3

我不确定以下方法是否是推荐的方法,或者我忽略了任何潜在问题,但我的项目编译并且所有测试都通过了。

在 Gradle 中,您可以将依赖项添加到特定的项目配置中:

dependencies {
    implementation project(path: ':some-library', configuration: 'configName')
}

通过反复试验,我发现为每个平台模块类型指定以下配置依赖项是可行的:

  • 常见的:configuration: 'archives'。如果没有这个,Gradle 配置将失败,因为找不到代码依赖项。

如果没有以下内容,编译将失败:

  • 虚拟机:configuration: 'jvmDefault'
  • js:configuration: 'jsDefault'

例如,对于问题中指定的 JS 模块:

dependencies {
    implementation project(path: ':some-library', configuration: 'jsDefault')
}
于 2019-03-21T12:51:01.577 回答
0

基本上,您不需要在涉及 Kotlin Muiltiplatform 项目的项目到项目依赖项中指定平台。Kotlin 插件以 Gradle 将自动选择适当目标的工件的方式设置依赖关系解析。

因此,例如,在 Kotlin/JVM 单目标项目中,您可以只使用project("...")对多平台项目的依赖项:

dependencies {
    implementation(project(":multiplatform-library")
}

如果:multiplatform-library有 JVM 目标,则此依赖项将解析为 JVM 目标的工件。否则,您将遇到列出候选配置的依赖关系解析失败。

这在 Kotlin 参考,使用 Gradle 构建多平台项目 – 添加依赖项中进行了描述,但也适用于单平台项目:

<...>project('...')对另一个多平台项目的依赖会自动解析为适当的目标。在源集的依赖项中指定单个project('...')依赖项就足够了,并且包含源集的编译将收到该项目的相应平台特定工件,前提是它具有兼容的目标。

如果您没有发生这种情况,请发布特定的依赖关系解析失败日志,或在https://kotl.in/issue提交问题。

于 2019-03-21T13:25:36.160 回答