无法将环境变量输入 application.conf

Having trouble getting environment variable into application.conf

我正在使用 Scredis,一个 Scala Redis 库。要实例化 Redis 对象,我必须向它传递一个配置和配置值的路径。 (据我所知,没有其他方法可以为 Redis 对象提供其主机名和端口)

基本上,我需要将 Redis 端口和主机名存储在配置中。现在的问题是我正在尝试使用 Heroku 来部署它,并且主机名和端口都位于环境变量中。我了解到我可以从 application.conf 访问环境变量,但由于它们存储为一个长字符串,所以我无法在将其传递给 Redis 对象之前将其分解。我知道如何从代码中的 env var 中获取 env var,但是由于我无法直接传递它,所以我完全不知道如何执行此操作。

这里是 Scredis 的配置信息:https://github.com/Livestream/scredis/wiki/Configuration

在 heroku 上为 java/scala 使用 redis-cloud: https://devcenter.heroku.com/articles/rediscloud#using-redis-from-java

免责声明 - 我不是 Scala 专家 :)

看起来 scredis 是通过 application.conf 和类型安全配置库配置的,所以一种方法是在 dyno 启动时生成飞行。

根据Heroku's build behavior for Scala,执行此操作的方法是将启动脚本添加到强制性stage 任务。在您的情况下,启动脚本应该解析 REDISCLOUD_URL env var 的内容并将它们写入 application.conf 文件。

根据scredisthese examples,也可以创建一个客户端,将配置放在代码中。

// Creates a non-blocking client with provided parameters, falling back to default
// configuration for non-provided parameters.
val clientWithParameters = Client(
  host = "192.168.1.1",
  port = 6380,
  passwordOpt = Some("foobar")
)

所以,两者的伪组合可能是这样的:

val redisUri = URI( System.getenv("REDISCLOUD_URL") )
val redisClient =  Client(
    host = redisUri.getHost(),
    port =  redisUri.getPort(),
    passwordOpt = redisUri.getPassword()
)

Typesafe Config 和 Play Framework 使这对您来说非常容易,因为 Typesafe Config 还加载环境变量来解析配置值。你基本上有两个选择。

选项 1:确保环境变量与配置键 scredis 期望的名称相同。这在您想要在启动时更改给定配置值的情况下很有用 - 例如您有以下 application.conf:

{
  foo = bar
}

但是在运行时你希望 foo 的值是 baz。然后您可以通过环境变量或 -D.

传递新值
$ foo=baz activator run
$ activator run -Dfoo=baz

选项2:在你application.conf有一个占位符来读取环境变量。假设 Heroku 传递给您的环境变量是 REDIS_HOSTREDIS_PORT,那么在您的 application.conf 中您可以执行以下操作:

scredis {
  redis {
    host = ${REDIS_HOST}
    port = ${REDIS_PORT}
  }
}