SBT поддерживает пошаговую компиляцию, но Scoverage не поддерживает ее. Scoverage очищает информацию об инструментах перед началом компиляции и каждый раз запускает процесс с нуля. Компиляция подмножества всех классов с включенным Scoverage приведет к неправильным отчетам о покрытии.
В этом случае плагин sbt-buldinfo
включен в модуле server
. Он регистрирует генератор исходного кода, который выполняется перед каждой компиляцией и генерирует файл server/target/scala_2.12/src_managed/main/sbt-buildinfo/BuildInfo.scala
.
Плагин SBT BuildInfo достаточно умен, чтобы регенерировать этот файл только при изменении его содержимого, но, поскольку BuildInfoOption.BuildTime
включен в настройку buildInfoOptions
,
Этот файл восстанавливается перед каждой компиляцией.
Когда дело доходит до процесса компиляции, компилятор каждый раз находит один измененный файл (BuildInfo.scala
) и запускает пошаговую компиляцию этого одного файла. Scoverage очищает свою предыдущую информацию об инструментах и сохраняет только информацию о файле BuildInfo.scala
.
В случае выполнения, подобного sbt clean coverage test dockerComposeUp it:test dockerComposeStop coverageReport
, первый процесс компиляции является частью задачи test
, а второй - it:test
. Вот почему нет проблем, когда они используются отдельно.
Докер не имеет никакого отношения к нашей проблеме.
Чтобы решить эту проблему, вы должны предотвращать BuildInfo.scala
регенерацию файлов при каждой компиляции, по крайней мере, когда включено покрытие.
Я сделал это, изменив файл project/Settings.scala
следующим образом:
private lazy val buildInfoSettings = Seq(
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
buildInfoOptions ++= { if (coverageEnabled.value) Seq() else Seq(BuildInfoOption.BuildTime) }, // <-- this line was changed
buildInfoOptions += BuildInfoOption.ToJson,
buildInfoPackage := "pme123.adapters.version"
)
buildInfoOptions
не включает параметр BuildTime
при включенном покрытии.
Это не выглядит элегантно, но работает. Вы, вероятно, можете найти лучший способ.