4

我们正在将我们的应用程序迁移到Play Framework。我们一直在使用 gradle 构建系统,并且在 sbt 方面遇到了一些问题。

我们使用 jooq 作为数据库,这意味着我们的构建文件需要包含数据库用户名/密码(因为 jooq 通过读取 db 模式生成代码)。由于这不是一个好主意,所有敏感数据都存储在构建可能运行的每个主机上的受保护文件中,构建系统从文件中读取,然后相应地配置系统。这在 gradle 中非常简单,但我遇到了 sbt 的死胡同。这是我到目前为止所拥有的:

import org.json4s._
import org.json4s.native.JsonMethods.

val jsonBuildConfig = TaskKey[JValue]("json-build-config")

jsonBuildConfig := {
   val confLines = scala.io.Source.fromFile("/etc/application.conf").mkString
   parse(confLines)
}

jooqOptions := Seq(
  "jdbc.driver"   -> "org.postgresql.Driver",
  "jdbc.url"      -> "FIXME",
  "jdbc.user"     -> "FIXME",
  "jdbc.password" -> "FIXME"
)

问题是三个配置参数,FIXME作为它们的当前值jooqOptions,需要从文件中选择。

在 内jsonBuildConfig,我可以这样做:

val confLines = scala.io.Source.fromFile("/etc/application.conf").mkString
val jsonConf = parse(confLines)
(jsonConf / "stagingdb" / "url").values

但是如何在jooqOptionsconf set 中设置呢?

4

1 回答 1

3

如果我正确理解了您的问题,您希望该jooqOptions值取决于jsonBuildConfig. 这里有一个部分:

http://www.scala-sbt.org/0.13.5/docs/Getting-Started/More-About-Settings.html

基本上,你会想要使用<<=而不是:=设置jooqOptions,例如

jooqOptions <<= jsonBuildConfig.apply { jsonConf =>
  val dbSettings = jsonConf / "stagingdb"
  val dbUrl = dbSettings / "url"
  val dbUser = ...
  ...
  Seq("jdbc.driver" -> "...", "jdbc.url" -> dbUrl, ...)
}

对于较新版本的 SBT,您可以通过在设置初始化程序块中setting.apply{...}调用来避免该模式,例如setting.value

jooqOptions := {
  val dbSettings = jsonBuildConfig.value / "stagingdb"
  ...
}

我链接到 SBT 0.13.5 的文档,它确实支持该.value功能。仔细检查您使用的 SBT 版本,并打开相应的文档页面以查看它是否支持该功能。

于 2014-12-20T22:09:52.580 回答