可以在编译时使用SBT嵌入信息吗?

时间:2018-09-14 16:32:30

标签: scala sbt

背景:我们正在研究一个通过数据生成模型的Spark管道。标准数据科学的东西。我们将在各种地方使用这些模型,并进行A / B测试,以确保与旧模型保持一致。我想向所有输出的模型添加数据,这些数据可以告诉我们哪个版本的代码生成了该模型,但我不仅要拥有一个版本,还希望包括有关.jar的唯一信息。编译时间,编译时使用的计算机,用户名等。我们还可以对开发人员在发布过程之外编译的内容进行A / B测试。

SBT中有什么好方法可以在编译时计算这些内容并将其嵌入程序中吗?

1 个答案:

答案 0 :(得分:0)

我们最终通过sbt-release使用sbt-buildinfo和Vcs插件的组合来完成这项工作。这是我们放入build.sbt文件中的内容:

lazy val root = (project in file(".")).
  enablePlugins(BuildInfoPlugin).
  settings(
    buildInfoKeys := Seq[BuildInfoKey](
      name,
      version,
      scalaVersion,
      sbtVersion,
      // actions are computed at compile time
      BuildInfoKey.action("buildTime") {
        LocalDateTime.now(Clock.systemUTC())
      },
      // actions are computed at compile time
     BuildInfoKey.action("buildUser") {
        val user = System.getenv("USER")
        val username = System.getenv("USERNAME")
        if (user != null) user
        else if (username != null) username
        else "Unknown"
      },
      BuildInfoKey.action("buildSha") {
        // Find the current version control system and get the current hash of it
        Vcs.detect(new File(".")).map(_.currentHash)
      }
        ),
    buildInfoPackage := "company.package"
  )

关键是在编译时而不是运行时计算并设置BuildInfo动作。