如何将项目依赖项添加到由`kotlin-multiplatform`插件创建的特定平台目标上?

时间:2019-03-21 12:39:28

标签: gradle kotlin kotlin-multiplatform

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

Starting from Kotlin 1.3,现在使用一个kotlin-multiplatform插件将其统一。 The current documentation specifies how to set up multiplatform projects using this approach

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

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

鉴于现在由新插件指定和管理特定于平台的模块,我该如何处理?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

  • 常见的:configuration: 'archives'。否则,Gradle配置将失败,因为找不到代码依赖项。

不执行以下操作,编译将失败:

  • jvm:configuration: 'jvmDefault'
  • js:configuration: 'jsDefault'

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

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

答案 1 :(得分:0)

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

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

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

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

这在Kotlin参考文献Building Multiplatform Projects with Gradle – Adding Dependencies中进行了描述,但也适用于单平台项目:

  

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

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