如何在 sbt 项目中发布仅测试对象

问题描述

我一直在为我的团队开发一个通用库,我需要在其中为最终用户提供模拟数据来编写单元测试代码。理想情况下,模拟对象应该只可用于引用我的包的测试,但我不确定如何执行此操作。

我的包结构是:

├── common
│   ├── src
│   │   ├── main
│   │   │   ├── resources
│   │   │   └── scala
│   │   └── test
│   │       ├── resources
│   │       └── scala
│   │           └── MockData.scala // <--- object defined here
├── build.sbt

在我的 build.sbt 中,我有

Test / publishArtifact := true
Test / publish := true

packageBin / publishArtifact := true

我使用 sbt clean; sbt compile; sbt publishLocal 在本地发布我的库。

在引用上述库的项目中,我在 build.sbt 中添加了以下内容


ThisBuild / libraryDependencies ++= Seq(
  "org.my" %% "common" % "0.0.1","org.my" %% "common" % "0.0.1" % Test,)

但是在编写测​​试时,我找不到 MockData.scala 中定义的对象。

请提供一些提示,非常感谢。

------------------- 更新 ------------------

在谷歌搜索之后,我决定编写一个单独的模块来仅发布测试数据。所以我的包结构变成了:

├── common
│   ├── src
│   │   ├── main
│   │   │   ├── resources
│   │   │   └── scala
│   │   └── test
│   │       ├── resources
│   │       └── scala
├── common-testkit
│   ├── src
│   │   └── main
│   │       ├── resources
│   │       └── scala
│   │           └── MockData.scala // <--- object defined here
├── build.sbt

解决方法

问题在于您要求检索其他项目中的测试代码的方式。

"org.my" %% "common" % "0.0.1" % Test 表示在运行其他项目的测试时依赖于项目的“主”代码。这就是范围 Test(在版本之后)的含义。

您想要的是在运行测试时依赖于公共项目的“测试代码”。这是通过在 sbt 中指定所谓的“分类器”来完成的:

"org.my" %% "common" % "0.0.1" % Test classifier "tests"