Присвойте имя корневому проекту, сохраняя агрегацию по умолчанию - PullRequest
1 голос
/ 10 апреля 2019

У меня довольно большой проект sbt (около 30 подпроектов).Из того, что я понял, sbt будет использовать имя корневого каталога в качестве имени корневого проекта, если ни один из них явно не объявлен в build.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 Ответ

2 голосов
/ 11 апреля 2019

Вот потенциальное решение без необходимости явной ссылки на корневой проект.

Учитывая следующую структуру проекта, состоящую из корневого проекта и подпроектов 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, которая оценивает testиспользуя inAnyProject фильтр области действия

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...