【问题标题】:Does sbt have something like gradle's processResources task with ReplaceTokens support?sbt 是否有类似 gradle 的 processResources 任务并支持 ReplaceTokens?
【发布时间】:2013-05-17 04:17:57
【问题描述】:

我们正在从 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 的新手,所以如果这似乎是一个愚蠢的问题,请原谅我。归根结底,我需要一种从我构建的环境中提取一些信息并将这些信息放入一个属性文件中的方法,该文件可以在运行时加载类路径。非常感谢您提供的任何见解来帮助我完成这项工作。

【问题讨论】:

标签: sbt


【解决方案1】:

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

【讨论】:

  • 叹息。难以置信。 sbt-buildinfo 设法生成一个带有信息的 BuildInfo 类文件,这正是我想要的。问题是生成以某种方式导致 Play 2.1.1 在每次请求时重新加载整个应用程序!这仅在“播放运行”中发生,但在我从“播放分配”发行版运行应用程序时不会发生。让鲍勃伤心。
  • 这可能来自buildTimestamp,每次运行任务都会改变BuildInfo的内容,导致它被重新编译并导致重新加载。我不确定所有的交互,所以你可能会问一个新问题,突出显示 sbt-buildinfo、构建时间戳,并用 playframework(或任何正确的标签)标记它。
  • 是的,这就是罪魁祸首。对于如何处理它,我处于困境和艰难的境地之间。我倾向于使用 gradle/ant 解决方案,该解决方案仅在执行特定任务时才对编译后的工件进行后处理。无论如何,感谢您的帮助。
  • 我希望看到这项工作,我相信 Play 和 build-info 开发人员也会这样做。你介意解释如何复制吗? a) 播放项目 b) 使用上述配置构建信息 c) 播放运行 d) ???
【解决方案2】:

以下是您要查找的内容吗:

sbt-editsource: An SBT plugin for editing files

sbt-editsource 是 SBT 0.11.x 和 更大。在某种程度上,对于 SBT,这是一个穷人的 sed(1)。它提供了 将逐行替换应用于源文本文件的能力, 生成编辑后的输出文件。它支持两种编辑方式:

变量替换,其中 ${var} 被一个值替换。类似sed 正则表达式替换。

这是来自Community Plugins

【讨论】:

  • 当然,这很有趣,但我很确定 github.com/sbt/sbt-buildinfo 可以满足我的需求,现在我只需要学习如何使用它。谢谢。
猜你喜欢
  • 2018-12-10
  • 1970-01-01
  • 2019-12-15
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 1970-01-01
相关资源
最近更新 更多