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

时间:2016-05-27 16:40:05

标签: scala testing dependencies sbt

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

  • A取决于B.
  • A和B的正常项目包是兼容的。
  • A有一个测试包,它与B的包不兼容 用于测试。
  • A不依赖于B&B的测试包
  • 由于测试包不兼容,A&#t>测试失败

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

我正在使用

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

含义

  • 编译取决于B&#39的编译
  • A的测试取决于B的编译。

我做错了吗?

Here's the actual build file。相关项目为doobieSupport23,具体取决于core

Here's the build error。你可以看到它在构建中拉动了scalaz 7.2,但它应该只是拉动scalaz 7.1.6

2 个答案:

答案 0 :(得分:0)

问题肯定不在于彼此依赖的项目,在我看来,配置let mysqldump = spawn([ 'mysqldump', '-v', '-u', 'my_db_name', '--password=' + process.env.MY_PRODUCTION_PASSWORD, '-h', 'my_domain.com', 'my_db_name', '< ' + dump_filename ].join(' '), { stdio: 'inherit', shell: true }); 对于你需要实现的目标是完全有效的。

造成问题的原因是由于A依赖于B而共享"compile->compile;test->compile"。幸运的是,sbt允许非常精确地管理依赖关系。

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

libraryDependencies

如果由于较新的版本实际上在其他核心的依赖项中使用而无法使其正常工作,则可以采用以下技巧:

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() ) 组合子。由于类路径中的类不兼容,我不确定它是否会在运行时失败。

答案 1 :(得分:0)

我在问题中指定的内容完全符合预期。

问题最终是我的构建文件有一个我刚刚掩盖的无关的依赖。这种依赖性导致doobie 3.0被拉进去,我只期待doobie 2.3。