64

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

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”)?如果可以的话,我不想在两个地方重复它们。

非常感谢任何指导!

4

2 回答 2

64

sbt-buildinfo

我刚刚写了sbt-buildinfo。安装插件后:

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

编辑:上面的代码片段已经更新以反映更新版本的 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.

于 2012-01-05T02:00:31.107 回答
50

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

val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion
于 2012-11-24T23:44:00.057 回答