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

Scala 无法将环境变量导入application.conf,scala,heroku,playframework,redis,playframework-2.0,Scala,Heroku,Playframework,Redis,Playframework 2.0,我正在使用Scredis,一个scala Redis库。要实例化Redis对象,我必须向其传递配置和配置值的路径。(据我所知,没有其他方法可以为Redis对象提供其主机名和端口) 基本上,我需要在配置中存储Redis端口和主机名。现在的问题是,我试图使用Heroku来部署它,主机名和端口都驻留在一个环境变量中。我已经了解到,我可以从application.conf访问env vars,但由于它们存储为一个长字符串,因此在将其传递给Redis对象之前,我无法将其分解。我知道如何从代码中的env-v

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

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

以下是Scredis的配置信息:

在heroku上使用redis cloud for java/scala:
免责声明-我不是Scala专家:)

它看起来像是通过
application.conf
和Typesafe配置库配置的
scredis
,因此一种方法是生成动态启动时的飞行


根据,实现这一点的方法是向必需的
阶段
任务添加启动脚本。在您的情况下,启动脚本应该解析
REDISCLOUD\u URL
env var的内容,并将其写入
application.conf
文件。

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

它看起来像是通过
application.conf
和Typesafe配置库配置的
scredis
,因此一种方法是生成动态启动时的飞行

根据,实现这一点的方法是向必需的
阶段
任务添加启动脚本。在您的情况下,启动脚本应该解析
REDISCLOUD\u URL
env var的内容,并将其写入
application.conf
文件。

根据
scredis
,还可以创建一个将配置放入代码中的客户端

// 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()
)
根据
scredis
,还可以创建一个将配置放入代码中的客户端

// 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配置和Play框架使这对您来说非常容易,因为Typesafe配置还加载环境变量来解析配置值。你基本上有两个选择

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

{
  foo = bar
}
但在运行时,您希望
foo
的值为
baz
。然后,您可以通过环境变量或
-D
传递新值

$ foo=baz activator run
$ activator run -Dfoo=baz
选项2:
application.conf
中有一个占位符来读取环境变量。假设Heroku传递的环境变量是
REDIS\u HOST
REDIS\u PORT
,那么在
application.conf
中可以执行以下操作:

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

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

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

{
  foo = bar
}
但在运行时,您希望
foo
的值为
baz
。然后,您可以通过环境变量或
-D
传递新值

$ foo=baz activator run
$ activator run -Dfoo=baz
选项2:
application.conf
中有一个占位符来读取环境变量。假设Heroku传递的环境变量是
REDIS\u HOST
REDIS\u PORT
,那么在
application.conf
中可以执行以下操作:

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

这根长绳子是什么?您不能在Heroku中同时为
REDIS\u主机
REDIS\u端口
设置环境变量吗?这一个长字符串是什么?你不能在Heroku中为
REDIS\u HOST
REDIS\u PORT
设置环境变量吗?我知道向你展示这个问题是个好主意-你的答案更好:)我知道向你展示这个问题是个好主意-你的答案更好:)