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

How to publish Test Only Objects in a sbt project

我一直在为我的团队开发一个公共库,我需要在其中为最终用户提供模拟数据以编写单元测试代码。理想情况下,模拟对象应该只对引用我的包的测试可用,但我不确定该怎么做。

我的包结构是:

├── 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"