我有一个相当大的 sbt 项目(大约30个子项目)。根据我的了解,如果在build.sbt
中没有明确声明,则sbt将使用根目录的名称作为根项目的名称。根据检出项目的位置,例如在CI环境中,该名称可能会更改。我目前正在使用sbt 1.2.8。
我的问题是我想为根项目分配一个稳定的名称,以便例如使用sbt root/test
[0]运行所有测试,并利用根项目在所有子项目上的默认聚合。到目前为止,我发现为根项目分配名称的唯一方法是显式声明该项目。但这将禁用默认聚合。
是否可以为根项目分配一个名称,以在所有子项目中保留默认聚合?还是有另一种方法可以在命令行上不依赖其名称来访问根项目?
[0]:build.sbt
使用onLoad in Global := (Command.process("project ...", _)) compose (onLoad in Global).value
更改了默认项目。因此,仅运行sbt test
是行不通的。
答案 0 :(得分:2)
这是一个潜在的解决方案,无需显式引用根项目。
给出以下项目结构,该结构由根项目以及子项目core
和util
组成
build.sbt
core
project
src
target
util
以及build.sbt
lazy val util = (project in file("util"))
lazy val core = (project in file("core"))
onLoad in Global := { Command.process("project util", _: State) } compose (onLoad in Global).value
ThisBuild / libraryDependencies += "org.scalatest" %% "scalatest" % "3.0.5" % Test
通过定义自定义任务testAll
,我们可以使用inAnyProject
范围过滤器对test
进行评估,从而可以在处于任何特定子项目中的所有项目中运行测试
val testAll = taskKey[Unit]("Run tests in all projects whilst being in any particular sub-project")
ThisBuild / testAll := Def.taskDyn {
(Test / test).all(ScopeFilter(inAnyProject))
}.value
现在,执行sbt
会默认加载util
子项目,不过testAll
应该运行所有项目的所有测试:
sbt:util> testAll
[info] RootSpec:
[info] The Root object
[info] - should say root hello
[info] UtilSpec:
[info] The Util object
[info] - should say util hello
[info] CoreSpec:
[info] The Core object
[info] - should say core hello
[info] Run completed in 349 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Run completed in 309 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[info] Run completed in 403 milliseconds.
[info] Total number of tests run: 1
[info] Suites: completed 1, aborted 0
[info] Tests: succeeded 1, failed 0, canceled 0, ignored 0, pending 0
[info] All tests passed.
[success] Total time: 1 s, completed 11-Apr-2019 16:29:26
sbt:util>
其中RootSpec
,CoreSpec
和UtilsSpec
位于
src/test/scala/example/RootSpec.scala
core/src/test/scala/example/CoreSpec.scala
util/src/test/scala/example/UtilSpec.scala