我有一个包含2个子项目的SBT项目,并且我希望所有子项目的测试编译器设置都与常规编译器设置不同。即我想-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
尝试为多个子项目定义通用设置时,常常会误解作用域轴值。请注意,它不意味着
将此通用设置添加到该版本中的所有子项目中
相反,意思更接近
如果子项目未定义此设置,则可能委托(回退)到
ThisBuild
例如,inspect Test / scalacOptions
在基本的hello world项目上执行
...
[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范围委派规则的工作方式
ThisBuild / Test / scalacOptions
这并不意味着子项目中的测试将自动选择新值,因为新值在选择顺序中非常低。
我认为,围绕sbt可能令人困惑的作用域规则的最直接方法是定义一个val
具有通用设置的,然后将该值简单地添加到每个子项目中,或者定义一个自动插件
自动插件可以全面注入项目设置
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句