我们正在从Java / Gradle堆栈迁移到Scala / SBT。我们的gradle构建利用一个名为processResources的任务和一些名为ReplaceTokens的Ant过滤器来动态替换签入的.properties文件中的标记,而不实际更改.properties文件(只是更改输出)。 gradle任务看起来像:
processResources {
def whoami = System.getProperty( 'user.name' );
def hostname = InetAddress.getLocalHost().getHostName()
def buildTimestamp = new Date().format('yyyy-MM-dd HH:mm:ss z')
filter ReplaceTokens, tokens: [
"buildsig.version" : project.version,
"buildsig.classifier" : project.classifier,
"buildsig.timestamp" : buildTimestamp,
"buildsig.user" : whoami,
"buildsig.system" : hostname,
"buildsig.tag" : buildTag
]
}
此任务查找src / main / resources目录中的所有模板文件,执行必要的替换并在build / resources / main输出结果。换句话说,它从...转换src / main / resources / buildsig.properties
buildsig.version=@buildsig.version@
buildsig.classifier=@buildsig.classifier@
buildsig.timestamp=@buildsig.timestamp@
buildsig.user=@buildsig.user@
buildsig.system=@buildsig.system@
buildsig.tag=@buildsig.tag@
...构建/ resources / main / buildsig.properties ...
buildsig.version=1.6.5
buildsig.classifier=RELEASE
buildsig.timestamp=2013-05-06 09:46:52 PDT
buildsig.user=jenkins
buildsig.system=bobk-mbp.local
buildsig.tag=dev
最终,它会进入WEB-INF / classes / buildsig.properties的WAR文件。这类似于冠军,可以在属性文件中记录构建特定信息,该文件在运行时从类路径加载。
我在SBT做什么来完成这样的事情?我是Scala / SBT的新手所以请原谅我,如果这似乎是一个愚蠢的问题。在一天结束时,我需要的是从我构建的环境中提取一些信息并将该信息放入可在运行时加载的类路径的属性文件中。您可以提供任何有助于我完成此任务的见解。
答案 0 :(得分:7)
sbt-buildinfo
是个不错的选择。 README显示了如何定义应在每次编译时运行的自定义映射和映射的示例。除了直接添加正常设置(如version
所示)之外,您还需要这样的部分:
buildInfoKeys ++= Seq[BuildInfoKey](
"hostname" -> java.net.InetAddress.getLocalHost().getHostName(),
"whoami" -> System.getProperty("user.name"),
BuildInfoKey.action("buildTimestamp") {
java.text.DateFormat.getDateTimeInstance.format(new java.util.Date())
}
)
答案 1 :(得分:2)
以下是您正在寻找的内容:
sbt-editsource: An SBT plugin for editing files
sbt-editsource是SBT 0.11.x和。的文本替换插件 更大。在某种程度上,对于SBT来说,这是一个穷人的sed(1)。它提供了 能够将逐行替换应用于源文本文件, 生成编辑的输出文件。它支持两种编辑:
变量替换,其中$ {var}由值替换。 SED样 正则表达式替换。