【问题标题】:Different options for test on a multiproject Scala SBT using ThisBuild使用 ThisBuild 在多项目 Scala SBT 上进行测试的不同选项
【发布时间】:2020-10-23 05:54:56
【问题描述】:

我有一个包含 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 下进行范围,并尝试了上述各种组合。

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)

我对某事有错误的理解还是这是一个错误?

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

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

    将此通用设置添加到此构建中的所有子项目

    反而意思更接近

    如果子项目未定义此设置,则可能委托(回退)给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

    自动插件可以全面注入项目设置

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

    【讨论】:

    • 我知道所有这些东西,但我无法将它们放在一起。 SBT 很复杂。我真的不喜欢使用通用设置val,我正在尝试使用自动插件,因为我已经定义了一些
    猜你喜欢
    • 1970-01-01
    • 2015-02-05
    • 2015-03-11
    • 2013-12-07
    • 2011-10-22
    • 2014-11-07
    • 2011-07-03
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多