В общем, без каких-либо плагинов, вы можете сделать что-то вроде этого:
sourceGenerators in Compile += Def.task {
val file = (sourceManaged in Compile).value / "foo" / "bar" / "BuildInfo.scala"
IO.write(
file,
s"""package foo.bar
|object BuildInfo {
| val Version = "${version.value}"
|}""".stripMargin
)
Seq(file)
}.taskValue
А потом делайте с foo.bar.BuildInfo.Version
константой все, что захотите.
Или более общий:
def generateBuildInfo(packageName: String,
objectName: String = "BuildInfo"): Setting[_] =
sourceGenerators in Compile += Def.task {
val file =
packageName
.split('.')
.foldLeft((sourceManaged in Compile).value)(_ / _) / s"$objectName.scala"
IO.write(
file,
s"""package $packageName
|object $objectName {
| val Version = "${version.value}"
|}""".stripMargin
)
Seq(file)
}.taskValue
Пример:
settings(generateBuildInfo("foo.bar"))
Вы можете даже изменить это, чтобы передать свойства объекта как Map[String, String]
и сгенерировать объект соответствующим образом.