使用 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",
)
我尝试了很多选项,但我无法设置不同于编译选项的测试选项。
作为一个简短的总结,我尝试了范围界定:
scalacOptions := Seq(XXX)
+ Test/scalacOptions := Seq(YYY)
Compile/scalacOptions := Seq(XXX)
+ Test/scalacOptions := Seq(YYY)
ThisBuild/scalacOptions := Seq(XXX)
+ ThisBuild/Test/scalacOptions := Seq(YYY)
ThisBuild/Compile/scalacOptions := Seq(XXX)
+ ThisBuild/Test/scalacOptions := Seq(YYY)
- 还尝试在
test
范围内进行调整,并尝试使用上述各项的各种组合。
最接近我的需要,但它不起作用,可能是因为它不适用于多项目文件。
更新:
我刚刚发现,如果我将设置范围限定到特定项目,那么我就会得到我想要的行为:
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
考虑我的相关 ,它演示了这两种方法。
我有一个包含 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",
)
我尝试了很多选项,但我无法设置不同于编译选项的测试选项。 作为一个简短的总结,我尝试了范围界定:
scalacOptions := Seq(XXX)
+Test/scalacOptions := Seq(YYY)
Compile/scalacOptions := Seq(XXX)
+Test/scalacOptions := Seq(YYY)
ThisBuild/scalacOptions := Seq(XXX)
+ThisBuild/Test/scalacOptions := Seq(YYY)
ThisBuild/Compile/scalacOptions := Seq(XXX)
+ThisBuild/Test/scalacOptions := Seq(YYY)
- 还尝试在
test
范围内进行调整,并尝试使用上述各项的各种组合。
更新:
我刚刚发现,如果我将设置范围限定到特定项目,那么我就会得到我想要的行为:
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
考虑我的相关