gpt4 book ai didi

scala - 如果我有一个 SBT 多项目构建,我怎样才能使 A 的测试依赖项不泄漏到 B 的测试中

转载 作者:行者123 更新时间:2023-11-28 20:14:22 25 4
gpt4 key购买 nike

所以,我有一个包含模块 A 和 B 的 SBT 项目。

  • A 依赖于 B。
  • A和B的正常项目包是兼容的。
  • A 有一个用于测试的包与 B 的包不兼容用于测试。
  • A不依赖B的测试包
  • A 的测试失败,因为测试包不兼容

在我看来,这个失败是无效的,因为A的测试不依赖于B的测试。

我在用

A.dependsOn(B % "compile->compile;test->compile")

意义

  • A的编译依赖于B的编译
  • A的测试依赖于B的编译。

我做错了什么吗?

Here's the actual build file .相关项目是 doobieSupport23 取决于 core

Here's the build error .您可以看到它在构建中引入了 scalaz 7.2,但它应该只引入了 scalaz 7.1.6

最佳答案

问题绝对不在相互依赖的项目中,配置"compile->compile;test->compile",在我看来,对于你需要的东西是完全有效的实现。

导致问题的原因是您的libraryDependencies 是共享的,因为A 依赖于B。幸运的是,sbt 允许非常精确地管理依赖关系。

最简单的建议是将冲突依赖项的较新版本应用到尽可能窄的范围 - 也就是说,如果 scalaz 7.2.0 仅在核心测试中需要,那就这样吧!

lazy val core = project(...)
.settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.2.0")
lazy val doobieSupport23 = project(...).dependsOn(core)
.settings(libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6")

如果你不能让它工作,因为新版本实际上在其他核心的依赖项中使用,下面的技巧可能会做到:

val scalazOld = "org.scalaz" %% "scalaz" % "7.1.6"
val scalazNew = "org.scalaz" %% "scalaz" % "7.2.0"

lazy val core = project(...)
.settings(libraryDependencies += "org.scalaz" %% "scalaz" % "7.2.0")

lazy val doobieSupport23 = project(...).dependsOn(core)
.settings(
libraryDependencies in Test += "org.scalaz" %% "scalaz" % "7.1.6" force()
)

注意 force() 组合子。我不确定这种方式是否会由于类路径中的类不兼容而在运行时失败。

关于scala - 如果我有一个 SBT 多项目构建,我怎样才能使 A 的测试依赖项不泄漏到 B 的测试中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37488527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com