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

时间:2015-02-10 02:44:49

标签: scala heroku playframework redis playframework-2.0

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

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

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

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

3 个答案:

答案 0 :(得分:2)

根据scredis的{​​{3}},也可以创建一个将配置放在代码中的客户端。

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

答案 1 :(得分:2)

Typesafe配置,因此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}
  }
}

答案 2 :(得分:1)

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

看起来scredis是通过application.conf和Typesafe配置库配置的,所以一种方法是在dyno启动时生成fly。

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