Могу ли я получить доступ к названию и версии моего приложения Scala (как установлено в SBT) из кода? - PullRequest
58 голосов
/ 04 января 2012

Я создаю приложение с 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? Я не хочу повторять их в двух местах, если смогу помочь.

Любое руководство с благодарностью!

Ответы [ 2 ]

57 голосов
/ 05 января 2012

SBT-buildinfo

Я только что написал sbt-buildinfo . После установки плагина:

lazy val root = (project in file(".")).
  enablePlugins(BuildInfoPlugin).
  settings(
    buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
    buildInfoPackage := "foo"
  )

Edit: приведенный выше фрагмент был обновлен, чтобы отразить более новую версию sbt-buildinfo.

Генерирует foo.BuildInfo объект с любым желаемым параметром, настраивая buildInfoKeys.

Специальный подход

Я собирался создать плагин для этого, (я написал), но вот быстрый скрипт для генерации файла:

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.

42 голосов
/ 25 ноября 2012

Имя и версия вставляются в манифест. Вы можете получить к ним доступ, используя java отражение из Package class.

val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...