如何在多平台多项目 Kotlin 构建中向另一个项目的测试添加依赖项

Posted

技术标签:

【中文标题】如何在多平台多项目 Kotlin 构建中向另一个项目的测试添加依赖项【英文标题】:How to add dependencies to tests of another project in a multi-platform multi-project Kotlin build 【发布时间】:2020-03-16 06:27:39 【问题描述】:

我有一个多平台 Kotlin 项目,其中包含多个模块(子项目)。 Kotlin 的Building Multiplatform Projects with Gradle 文档清楚地展示了如何设置模块之间的项目依赖关系:

kotlin 
    sourceSets 
        commonMain 
            dependencies 
                // All of the compilations that include source set 'commonMain'
                // will get this dependency resolved to a compatible target, if any:
                api project(':foo-lib')
            
        
    

我现在面临的问题是,虽然本文记录了如何将一个模块(其所有目标平台)的依赖项添加到另一个模块(其对应的目标平台),但它并没有阐明 如何添加一个对另一个模块的测试源的依赖.

我希望这是一个相当常见的用例。例如,我想这样做的原因之一是我的模块 A 的测试源包含存根类。模块 B 依赖于模块 A,包括在模块 A 的测试源中为其提供测试存根的类定义。因此,模块 B 的测试可能希望重用模块的测试源中定义的那些测试存根也就不足为奇了A.

多项目构建中的一个常见建议是将此类测试源移至另一个模块,但这对我来说似乎没有必要。在我看来更干净的解决方案exist for normal multi-project builds,但我不知道如何在多平台多项目 Kotlin 构建中配置等效的解决方案,该构建也依赖于上面代码中演示的 Kotlin Gradle DSL。

【问题讨论】:

你的意思是***.com/questions/5644011/… @user7294900 这似乎是关于如何为 normal 多项目构建执行此操作的文档,但如前所述,我无法弄清楚如何为 多平台多项目构建。 【参考方案1】:

要在单平台项目之间建立这种依赖关系,您通常需要在生产者项目中创建 Gradle Configuration,将测试编译输出或测试 JAR 添加到该配置中,然后在消费者中项目,依赖于该配置(即添加一个project(...) 依赖with an explicit configuration,或者,更可取的是,添加属性以确保Gradle 选择variant-aware dependency resolution 中的测试输出配置)。

但是,所有这些都要求将测试编译成可以被消费者项目的公共源集重用的形式。对于 Kotlin Multiplatform 项目,情况还不是这样。虽然参与已发布编译的生产通用源集被编译为 Kotlin 元数据(*.kotlin_metadata 文件),但测试源和其他类型的未发布代码尚未转换为该格式。

相反,测试目前仅编译为最终特定于平台的二进制文件(即*.class 文件、*.js、本机二进制文件),不能用于常见源分析。

因此,尚不支持此类依赖项。这在未来可能会改变。请在 Kotlin 问题跟踪器中关注此问题:KT-35073。

【讨论】:

以上是关于如何在多平台多项目 Kotlin 构建中向另一个项目的测试添加依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个build.gradle配置向kotlin多平台项目添加依赖项

如何在多项目构建中获取另一个项目的设置值

Gradle / javacard插件是否支持在多项目gradle构建中构建两个applet依赖项?

无法在 commonMain 中为 kotlin 多平台使用依赖项

Kotlin 与 Objective-C 框架的多平台/本机互操作性

错误:error.NonExistentClass Kotlin 在多模块 Dagger 项目中