我可以从代码访问我的Scala应用程序的名称和版本(在SBT中设置)吗?

我正在用SBT(0.11.0)构build一个应用程序,使用Scala构build定义,如下所示:

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文件。

我的问题是一个简单的问题:是否有一种方法从我的Scala代码以编程方式访问应用程序名称(“my-app-name”)和版本(“0.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的更新版本。

它可以通过自定义buildInfoKeys生成foo.BuildInfo对象。

临时方法

我一直在为此做一个插件, (我写了它),但是这里有一个快速的脚本来生成一个文件:

 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

名称和版本被插入到清单中。 您可以使用Package类中的javareflection来访问它们。

 val p = getClass.getPackage val name = p.getImplementationTitle val version = p.getImplementationVersion