【问题标题】:How to apply common test configuration to all projects?如何将通用测试配置应用于所有项目?
【发布时间】:2021-10-28 07:48:38
【问题描述】:

我正在将一个旧项目迁移到 Scala 3。build.sbt 如下:

import Dependencies._

inThisBuild(
  Seq(
    scalaVersion := "2.12.7",
    scalacOptions ++= Seq(
      "-unchecked",
      // more
    )
  )
    ++ inConfig(Test)(Seq(
    testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-o", "-e"),
    // more
  ))
)

lazy val root = (project in file("."))
  .aggregate(
    `test-util`
  )

lazy val `test-util` = project

现在,为了便于阅读,我想将 inThisBuild 中的内容分开。

import Dependencies._

ThisBuild / scalaVersion := "3.0.1"
ThisBuild / scalacOptions ++= Seq(
  "-unchecked",
  // more
)

lazy val testSettings = inConfig(Test)(
  Seq(
    testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-o", "-e"),
    // more
  ))


lazy val root = (project in file("."))
  .aggregate(
    `test-util`
  )
  .settings(testSettings)

lazy val `test-util` = project

如您所见,我必须为每个项目应用testSettings。理想情况下,我想做ThisBuild / Test := testSettings 之类的事情,但这不是有效的语法。

有没有办法将testSettings 应用于所有项目而无需显式设置.settings(testSettings)

编辑

我知道我可以用ThisBuild / Test 前缀编写testSettings 的每一行,但我不想重复相同的前缀。我正在寻找类似于我对 scalacOptions 所做的事情。

【问题讨论】:

    标签: scala sbt


    【解决方案1】:

    有没有办法将 testSettings 应用于所有项目而无需显式设置.settings(testSettings)

    考虑创建一个自动插件,它可以在所有子项目中自动注入设置,例如project/CommonTestSettings.scala

    import sbt._
    import Keys._
    
    object CommonTestSettings extends sbt.AutoPlugin {
      override def requires = plugins.JvmPlugin
      override def trigger = allRequirements
      override lazy val projectSettings =
        inConfig(Test)(
          Seq(
            testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-o", "-e")
            // more
          )
        )
    }
    

    您可以使用 show testOptions 进行测试,这应该会显示所有子项目中的通用设置,例如在我的项目中,root 聚合了 foobar 我得到类似的东西

    sbt:sbt-multi-project> show testOptions
    [info] foo / Test / testOptions
    [info]  List(Argument(Some(TestFramework(org.scalatest.tools.Framework, org.scalatest.tools.ScalaTestFramework)),List(-o, -e)))
    [info] bar / Test / testOptions
    [info]  List(Argument(Some(TestFramework(org.scalatest.tools.Framework, org.scalatest.tools.ScalaTestFramework)),List(-o, -e)))
    [info] Test / testOptions
    [info]  List(Argument(Some(TestFramework(org.scalatest.tools.Framework, org.scalatest.tools.ScalaTestFramework)),List(-o, -e)))
    

    【讨论】:

      【解决方案2】:

      正如您可以使用scalaVersionscalacOptions 一样,您也可以使用Test。例如:

      lazy val testSettings = inConfig(Test)(
        Seq(
          testOptions += Tests.Argument(TestFrameworks.ScalaTest, "-o", "-e"),
          // more
        ))
      

      可以改写为:

      ThisBuild / Test / testOptions += Test.Argument(TestFrameworks.ScalaTest, "-o", "-e")
      

      这是你想要的吗?还是直接传一个序列?

      【讨论】:

      • 不仅仅是testOptions(如图所示),我不想为每个重复ThisBuild / Test前缀。我正在寻找类似 @​​987654328@ 所做的事情。
      猜你喜欢
      • 2015-11-25
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多