首页 > 解决方案 > 如何将通用测试配置应用于所有项目?

问题描述

我正在将一个旧项目迁移到 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)

编辑

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

标签: scalasbt

解决方案


有没有办法将 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)))

推荐阅读