Могу ли я получить доступ к моему имени и версии приложения Scala (как указано в SBT) из кода?
Я создаю приложение с SBT (0.11.0), используя определение сборки Scala, например:
object MyAppBuild extends Build {
import Dependencies._
lazy val basicSettings = Seq[Setting[_]](
organization := "com.my",
version := "0.1",
description := "Blah",
scalaVersion := "2.9.1",
scalacOptions := Seq("-deprecation", "-encoding", "utf8"),
resolvers ++= Dependencies.resolutionRepos
)
lazy val myAppProject = Project("my-app-name", file("."))
.settings(basicSettings: _*)
[...]
Я упаковываю .jar в конце процесса.
Мой вопрос прост: есть ли способ получить доступ к имени приложения ( "my-app-name" ) и версии ( "0,1" ) программно из моего кода Scala? Я не хочу повторять их в двух местах, если я могу помочь.
Любое руководство высоко ценится!
Ответы
Ответ 1
SBT-buildinfo
Я только что написал sbt-buildinfo.
После установки плагина:
lazy val root = (project in file(".")).
enablePlugins(BuildInfoPlugin).
settings(
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
buildInfoPackage := "foo"
)
Изменить: приведенный выше фрагмент был обновлен, чтобы отобразить более новую версию sbt-buildinfo.
Он генерирует объект foo.BuildInfo
с любым параметром, который вы хотите, настроив buildInfoKeys
.
Ad-hoc-подход
Я имел в виду сделать плагин для этого, (я его написал), но здесь быстрый script для создания файла:
sourceGenerators in Compile <+= (sourceManaged in Compile, version, name) map { (d, v, n) =>
val file = d / "info.scala"
IO.write(file, """package foo
|object Info {
| val version = "%s"
| val name = "%s"
|}
|""".stripMargin.format(v, n))
Seq(file)
}
Вы можете получить свою версию как foo.Info.version
.
Ответ 2
Имя и версия вставляются в манифест. Вы можете получить к ним доступ с использованием java-отражения от Package class.
val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion