【问题标题】:Possible to embed information at compile time with SBT?可以在编译时使用 SBT 嵌入信息吗?
【发布时间】:2019-03-21 23:58:15
【问题描述】:

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

SBT 中是否有一种好方法可以在编译时计算这些内容并将其嵌入到程序中?

【问题讨论】:

  • 您可以使用任何您想要的信息生成任何文件:sbt doc。事实上,这个问题似乎有点太宽泛了。
  • 也可以看看sbt-buildinfo
  • @AndreyTyukin 你能发布你的 cmets 作为答案吗?
  • @laughedelic 关于sbt-buildinfo 的评论并不是一个真正的答案,它只是一个模糊的建议,即OP 可以在执行类似操作的编译器插件的代码中寻求一些灵感。我以前做过类似的事情,所以我很确定它可以工作,但我目前没有时间/精力深入研究 SBT 文档以刷新它的工作原理,与链接帖子中的 Eugene Yokota 不同,我我对 SBT 不够熟悉,无法在我的脑海中写下一个通用的 sbt 插件。正如我所说:目前这个问题太宽泛,因此无法回答。
  • @laughedelic 我也有点怀疑 SBT buildinfo 是否提供有关“编译它的计算机、用户名等”的信息。公平地说,sbt-buildinfo 似乎更加专注。但同样 - 它可能可以完成,但为此,提问者应该更具体地说明“所有这些东西”的含义。

标签: scala sbt


【解决方案1】:

我们最终通过 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 操作是在编译时而不是运行时计算和设置的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 2015-09-13
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    相关资源
    最近更新 更多