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