gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:50:36 25 4
gpt4 key购买 nike

我有一个包含 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) + 测试/scalacOptions := Seq(YYY)
  • 编译/scalacOptions := Seq(XXX) + 测试/scalacOptions := Seq(YYY)
  • ThisBuild/scalacOptions := Seq(XXX) + ThisBuild/Test/scalacOptions := Seq(YYY)
  • ThisBuild/Compile/scalacOptions := Seq(XXX) + ThisBuild/Test/scalacOptions := Seq(YYY)
  • 还尝试在 test 下确定范围并尝试上述各项的各种组合。

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

更新:

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

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

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

ThisBuild / Test / scalacOptions

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

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

Auto plugins can inject project settings across the board

考虑我的相关 answer这展示了这两种方法。

关于scala - 使用 ThisBuild 在多项目 Scala SBT 上进行测试的不同选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64472063/

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