使用 ThisBuild 在多项目 Scala SBT 上进行测试的不同选项

Different options for test on a multiproject Scala SBT using ThisBuild

我有一个包含 2 个子项目的 SBT 项目,我希望所有子项目的测试编译器设置不同于正常的编译器设置。 IE。我想对主要代码执行 -Xfatal-warnings,但对测试不执行。

我正在寻找一种解决方案,它不涉及单独设置每个子项目,而是同时设置所有子项目。

我正在使用 SBT 1.3.9 和 Scala 2.13.3

这是我在 SBT 中的示例:

lazy val root: Project = project
  .in(file("."))
  .aggregate(projectA, projectB)

lazy val projectA: Project = project
  .in(file("projectA"))
  .settings(
    name := "projectA",
  )

lazy val projectB: Project = project
  .in(file("projectA"))
  .settings(
    name := "projectA",
  )

我尝试了很多选项,但我无法设置不同于编译选项的测试选项。 作为一个简短的总结,我尝试了范围界定:

最接近我的需要,但它不起作用,可能是因为它不适用于多项目文件。

更新:

我刚刚发现,如果我将设置范围限定到特定项目,那么我就会得到我想要的行为:

projectA / Compile / scalacOptions := Seq(XXX)
projectA / Test / scalacOptions := Seq(YYY)
projectB / Compile / scalacOptions := Seq(XXX)
projectB / Test / scalacOptions := Seq(YYY)

但是如果我使用 ThisBuild 它不起作用

ThisBuild / Compile / scalacOptions := Seq(XXX)
ThisBuild / Test / scalacOptions := Seq(XXX)

是我理解有误还是这是一个错误?

ThisBuild 范围轴值在尝试为多个子项目定义通用设置时经常被误解。请注意它 not 意味着

add this common setting to all the subprojects in this build

反而意思更接近

If a subproject does not define this setting, then, possibly, delegate (fall back) to ThisBuild

例如,在基本的 hello world 项目上执行 inspect Test / scalacOptions 会得到

...
[info] Provided by:
[info]  ProjectRef(uri("file:/my/Path/To/Project/"), "root") / Test / scalacOptions
...
[info] Delegates:
[info]  Test / scalacOptions
[info]  Runtime / scalacOptions
[info]  Compile / scalacOptions
[info]  scalacOptions
[info]  ThisBuild / Test / scalacOptions
[info]  ThisBuild / Runtime / scalacOptions
[info]  ThisBuild / Compile / scalacOptions
[info]  ThisBuild / scalacOptions
[info]  Zero / Test / scalacOptions
[info]  Zero / Runtime / scalacOptions
[info]  Zero / Compile / scalacOptions
[info]  Global / scalacOptions
...

Provided by 部分显示具有最高优先级的范围

ProjectRef(uri("file:/my/Path/To/Project/"), "root") / Test / scalacOptions

然后 Delegates 部分显示了优先顺序的其余部分,我们注意到在使用 ThisBuild 作为项目轴的范围“上方”有一堆范围。因此,由于 sbt 范围委托 rules 的工作方式

ThisBuild / Test / scalacOptions

并不意味着子项目中的测试会自动选择新值,因为它的选择顺序非常低。

我认为围绕 sbt 令人困惑的范围规则最直接的方法是定义一个具有通用设置的 val,然后简单地将该值添加到每个子项目,或者定义一个 auto plugin

Auto plugins can inject project settings across the board

考虑我的相关 ,它演示了这两种方法。