在保留默认聚合的同时为根项目分配名称

时间:2019-04-10 15:48:13

标签: sbt

我有一个相当大的 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是行不通的。

1 个答案:

答案 0 :(得分:2)

这是一个潜在的解决方案,无需显式引用根项目。

给出以下项目结构,该结构由根项目以及子项目coreutil组成

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>

其中RootSpecCoreSpecUtilsSpec位于

src/test/scala/example/RootSpec.scala
core/src/test/scala/example/CoreSpec.scala
util/src/test/scala/example/UtilSpec.scala