web-dev-qa-db-fra.com

Puis-je accéder à mon Scala = (comme défini dans SBT) du code?

Je construis une application avec SBT (0.11.0) à l'aide d'un Scala Construire une définition comme suit:

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

Je suis en train d'emballer un .jar à la fin du processus.

Ma question est une solution simple: existe-t-il un moyen d'accéder à la noms de l'application ("nom mon-application") et de la version ("0,1") à partir de mon Scala=== Don ' Je veux les répéter à deux endroits si je peux l'aider.

Toute directive grandement appréciée!

58
Alex Dean

sbt-buildinfo

Je viens d'écrire sbt-buildinfo . Après avoir installé le plugin:

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

Edit: L'extrait ci-dessus a été mis à jour pour refléter une version plus récente de SBT-BuildInfo.

Il génère foo.BuildInfo Objet avec n'importe quel paramètre que vous voulez en personnalisant buildInfoKeys.

Approche ad hoc

J'ai eu le sens de faire un plugin pour cela, (Je l'ai écrit) mais voici un script rapide pour générer un fichier:

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)
}

Vous pouvez obtenir votre version comme foo.Info.version.

57
Eugene Yokota

Le nom et la version sont insérés dans Manifest. Vous pouvez y accéder en utilisant Java réflexion de package classe.

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