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

时间:2019-11-20 13:54:13

标签: gradle kotlin kotlin-multiplatform gradle-multi-project-build

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

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的测试可能想要重用在模块的测试源中定义的那些测试存根并不令人意外答:

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

1 个答案:

答案 0 :(得分:1)

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

但是,所有这些都要求将测试编译为可以由使用者项目的通用源集重用的形式。对于Kotlin Multiplatform项目,情况并非如此。虽然参与已发布的汇编的 production 通用源集被编译为Kotlin元数据(*.kotlin_metadata文件),但是测试源和其他类型的未发布代码尚未转换为格式。

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

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