web-dev-qa-db-ja.com

コードからScalaアプリの名前とバージョン(SBTで設定)にアクセスできますか?

私は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つの場所でそれらを繰り返したいです。

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

58
Alex Dean

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として取得できます。

57
Eugene Yokota

名前とバージョンがマニフェストに挿入されます。 Javaリフレクション Package クラスを使用してアクセスできます。

val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion
42
Andrej Herich