Scala 无法将环境变量导入application.conf
我正在使用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,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
免责声明-我不是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
设置环境变量吗?我知道向你展示这个问题是个好主意-你的答案更好:)我知道向你展示这个问题是个好主意-你的答案更好:)