sbt query

sbt 2.x 扩展了斜杠语法以支持子项目聚合:

act ::= [ query / ] [ config / ] [ in-task / ] ( taskKey | settingKey )

换言之,sbt query 是编写子项目轴的新方式。

子项目引用

子项目引用作为查询来选择子项目:

build.sbt 示例 1

scalaVersion := "3.8.1"

lazy val foo = project

对于上述构建,我们可以按以下方式在 foo 子项目上运行测试,语法与 sbt 1.x 相同:

foo/test

... 通配符

... 通配符可匹配任意字符,并可与其他字母和数字组合以筛选根聚合列表。例如,我们可以按以下方式在所有以 foo 开头的子项目上运行测试:

foo.../test

注意:* 与 ...

sbt query 有意使用 ...(省略号)而非更直观的 *(星号),因为 * 在 shell 中常被用作通配符来匹配现有文件或目录。这需要加引号,而忘记给 */test 加引号会匹配到类似 src/test 的内容。

@scalaBinaryVersion 参数

@scalaBinaryVersion 参数与子项目的 scalaBinaryVersion 设置匹配。

Example

val toolkitV = "0.5.0"
val toolkit = "org.scala-lang" %% "toolkit" % toolkitV

lazy val foo = projectMatrix
  .settings(
    libraryDependencies += toolkit,
  )
  .jvmPlatform(scalaVersions = Seq("3.8.1", "2.13.17"))

lazy val bar = projectMatrix
  .settings(
    libraryDependencies += toolkit,
  )
  .jvmPlatform(scalaVersions = Seq("3.8.1", "2.13.17"))

例如,我们可以按以下方式在所有 3.x 子项目上运行测试:

...@scalaBinaryVersion=3/test

可以从终端按以下方式使用:

$ sbt ...@scalaBinaryVersion=3/test
[info] entering *experimental* thin client - BEEP WHIRR
[info] terminate the server with `shutdown`
> ...@scalaBinaryVersion=3/test
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] No tests to run for Test / testQuick
[info] compiling 1 Scala source to /tmp/foo/target/out/jvm/scala-3.6.4/foo/test-backend ...
[info] Passed: Total 0, Failed 0, Errors 0, Passed 0
[info] No tests to run for bar / Test / testQuick
example.ExampleSuite:
  + Scala version 0.003s
[info] Passed: Total 1, Failed 0, Errors 0, Passed 1

这使我们能够筛选聚合的子项目,使用 projectMatrix 时子项目可能很多。