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

93ze6v8z  于 2023-01-13  发布在  Scala
关注(0)|答案(3)|浏览(131)

我正在使用SBT(0.11.0)构建一个应用,使用的Scala构建定义如下:

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: _*)
    [...]

在这个过程的最后,我会 Package 一个jar。
我的问题很简单:有没有一种方法可以从Scala代码中以编程方式访问应用程序的名称(“my-app-name”)和版本(“0.1”)?如果可以的话,我不想在两个地方重复它们。
任何指导不胜感激!

wfauudbj

wfauudbj1#

子构建信息

我刚刚写了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

muk1a3rh

muk1a3rh2#

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

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

xriantvc3#

你也可以生成一个动态配置文件,然后从scala中读取。

// generate config (to pass values from build.sbt to scala)
Compile / resourceGenerators += Def.task {
  val file = baseDirectory.value / "conf" / "generated.conf"
  val contents = "app.version=%s".format(version.value)
  IO.write(file, contents)
  Seq(file)
}.taskValue

当你运行sbt universal:packageBin的时候,这个文件就在那里了。

相关问题