SBT包括程序中的版本号

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SBT包括程序中的版本号相关的知识,希望对你有一定的参考价值。

我想要一个我正在构建的程序,以便能够在运行时报告自己的版本(例如scala myprog.jar --version)。传统上在maven项目中,我使用资源过滤(pom.xml - > file.properties - >在运行时读取值)。我知道有sbt-filter-plugin来模仿这个功能,但我很好奇是否有更标准/首选/聪明的方法在SBT中这样做。

tl; dr如何在运行时读取build.sbt中定义的版本号?

答案

更新中...

https://github.com/ritschwumm/xsbt-reflect(如上所述)已经过时,但有一个很酷的SBT发布工具可以自动管理版本和更多:https://github.com/sbt/sbt-release

或者,如果您想快速修复,可以从清单中获取版本,如下所示:

val version: String = getClass.getPackage.getImplementationVersion

此值将等于您在versionbuild.sbt中设置的项目中的Build.scala设置。

另一个更新......

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/

另一答案

使用xsbt-reflect插件。它将生成一个源文件,其中包含项目版本号等。

另一答案

一般来说,没有任何插件,你可以这样做:

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]传递并适当地生成对象。

另一答案

我最终制作了构建系统(我在Makefile上使用sbt)准备一个src/main/resources/version.txt文件供Scala阅读。

Makefile

$(RESOURCES_VERSION): build.sbt
    grep "^version := " $< | cut -f2 -d" > $@

在斯卡拉:

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

这适合我。

奇怪的是,Scala中不容易获得这样一个所需的功能(我认为)。一个非常简单的sbt插件只是为此欢迎。

以上是关于SBT包括程序中的版本号的主要内容,如果未能解决你的问题,请参考以下文章

在 build.sbt 中使用 Jenkins 内部版本号通过 sbt-native-packager 构建 RPM

关于scala工程结构(使用sbt)

似乎无法在 SBT 中的分叉 JVM 中运行 Play 应用程序

Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段

sbt无法在项目中导入两个不同版本的elasticsearch库

当我们尝试在 sbt 文件中使用 cloudera 上游版本时,sbt 程序集构建失败