2012-01-21 4 views
18

Я хочу создать программу, которую я создаю, чтобы иметь возможность сообщать о своей версии во время выполнения (например, scala myprog.jar --version). Традиционно в проекте maven я использовал фильтрацию ресурсов (pom.xml -> file.properties -> значение чтения во время выполнения). Я знаю, что есть sbt-filter-plugin, чтобы эмулировать эту функциональность, но мне любопытно, есть ли более стандартный/предпочтительный/умный способ сделать это в SBT.SBT, включая номер версии в программе

tl; dr Как я могу прочитать номер версии, определенный в build.sbt во время выполнения?

+0

Правильный идиоматический способ сделать это в настоящее время осуществляется через sbt-buildinfo https://github.com/sbt/sbt-buildinfo/. –

ответ

19

Update ...

https://github.com/ritschwumm/xsbt-reflect (упомянутый выше) Устаревший, но есть этот прохладный релиз инструмент SBT, который может автоматически управлять версиями и больше: https://github.com/sbt/sbt-release.

В качестве альтернативы, если вы хотите быстро исправить, вы можете получить версию из манифеста, как это:

val version: String = getClass.getPackage.getImplementationVersion 

Это значение будет равно version настройки Вашего проекта, который вы установили или в build.sbt или Build.scala.

Другой Update ...

Buildinfo SBT плагин может создать класс с номером версии, основанной на build.sbt:

/** This object was generated by sbt-buildinfo. */ 
case object BuildInfo { 
    /** The value is "helloworld". */ 
    val name: String = "helloworld" 
    /** The value is "0.1-SNAPSHOT". */ 
    val version: String = "0.1-SNAPSHOT" 
    /** The value is "2.10.3". */ 
    val scalaVersion: String = "2.10.3" 
    /** The value is "0.13.2". */ 
    val sbtVersion: String = "0.13.2" 
    override val toString: String = "name: %s, version: %s, scalaVersion: %s, sbtVersion: %s" format (name, version, scalaVersion, sbtVersion) 
} 

Посмотреть документацию о том, как включить его здесь: https://github.com/sbt/sbt-buildinfo/.

+2

К сожалению, это дает мне «нуль». sbt 0.13.8, JDK 8, Scala 2.11.7 – akauppi

+0

Вы правильно установили 'версию' в SBT? –

+0

Да, это отображается в имени файла jar выходного файла и так далее. Но проект не делает какой-либо Maven pom, это автономный исполняемый файл. Я предполагаю, что это причина, по которой он не получит эти версии реализации/спецификации и т. Д. Любые указатели приветствуются - я не из фона Java, поэтому они немного перегружены для меня. :) – akauppi

7

Используйте плагин xsbt-reflect. Он будет генерировать исходный файл, содержащий, помимо прочего, номер версии проекта.

+0

Спасибо, похоже, очень хорошее решение –

+0

Работали как шарм, еще раз спасибо. –

1

Я закончил создание системы сборки (я использую Makefile поверх sbt) подготовьте файл src/main/resources/version.txt для чтения Scala.

В Makefile:

$(RESOURCES_VERSION): build.sbt 
    grep "^version := " $< | cut -f2 -d\" > [email protected] 

В Scala:

val version: String = { 
    val src = Source.fromURL(getClass.getResource("/version.txt")) 
    src.getLines.next // just take the first line 
} 

Это работает для меня.

Любопытно, что такая необходимая функция (я думаю) не всегда доступна в Scala. Очень простой плагин sbt только для этого был бы рад.

+0

Это легко доступно в ванильном sbt, см. мой ответ. – Tvaroh

0

В общем, без каких-либо плагинов, вы можете сделать что-то вроде этого:

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] и генерации объекта соответствующим образом.

 Смежные вопросы

  • Нет связанных вопросов^_^