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
此值将等于您在version
或build.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
似乎无法在 SBT 中的分叉 JVM 中运行 Play 应用程序
Oracle 数据库 - 使用UEStudio修改dmp文件版本号,解决imp命令恢复的数据库与dmp本地文件版本号不匹配导致的导入失败问题,“ORACLE error 12547”问题处理(代码片段