私は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つの場所でそれらを繰り返したいです。
どんな指導も大歓迎です!
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
として取得できます。
名前とバージョンがマニフェストに挿入されます。 Javaリフレクション Package クラスを使用してアクセスできます。
val p = getClass.getPackage
val name = p.getImplementationTitle
val version = p.getImplementationVersion