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")にアクセスする方法はありますか?手伝うことができれば、2か所で繰り返したくありません。

どんな指導も大歓迎です!

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 に答える