Playframework Play Framework 2.4.x-activator~run不能替代application.conf中的env vars

Playframework Play Framework 2.4.x-activator~run不能替代application.conf中的env vars,playframework,typesafe-activator,Playframework,Typesafe Activator,我正在heroku上运行我的Play应用程序。heroku的想法是通过env变量设置各种设置。例如AWS S3秘密访问密钥及其ID。这是可以理解的。因此,按照良好实践,我将以下设置放在conf/application.conf中: # AWS. # ~~~~~ aws.accessKeyID = ${?AWS_ACCESS_KEY_ID} aws.secretAccessKey = ${?AWS_SECRET_ACCESS_KEY} 好的,很好。现在,每当我在PROD或DEV模式下运行时,我都

我正在heroku上运行我的Play应用程序。heroku的想法是通过env变量设置各种设置。例如AWS S3秘密访问密钥及其ID。这是可以理解的。因此,按照良好实践,我将以下设置放在conf/application.conf中:

# AWS.
# ~~~~~
aws.accessKeyID = ${?AWS_ACCESS_KEY_ID}
aws.secretAccessKey = ${?AWS_SECRET_ACCESS_KEY}
好的,很好。现在,每当我在PROD或DEV模式下运行时,我都可以更改它们,而不用担心硬编码。问题是,当我运行activator~run在本地开发我的应用程序时,这些设置没有被读取和设置。就像activator~run完全忽略了用选项替换环境变量一样。加载索引页时,我按以下方式阅读和打印它们:

import play.api.Play.current
...
val v1 = current.configuration.getString("aws.accessKeyID")
val v2 = current.configuration.getString("aws.secretAccessKey")
println("v1=" + v1 + ", v2=" + v2)
让我更详细地说明正在发生的事情:

floyd@floyd-VirtualBox:~/myproj$ echo $AWS_ACCESS_KEY_ID
access-key-id
floyd@floyd-VirtualBox:~/myproj$ echo $AWS_SECRET_ACCESS_KEY
secret-access-key
floyd@floyd-VirtualBox:~/myproj$ activator ~run
[info] Loading project definition from /home/floyd/myproj/project
[info] Set current project to myproj (in build file:/home/floyd/myproj/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.a.l.c.ActorSystemProvider - Starting application default Akka system: application
[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 1 Scala source to /home/floyd/myproj/target/scala-2.11/classes...
[success] Compiled in 15s
[info] - play.api.libs.concurrent.ActorSystemProvider - Starting application default Akka system: application
[info] - application - ReactiveMongoApi starting...
[info] - application - ReactiveMongoApi successfully started with DB 'test'! Servers:
        [localhost:27017]
[info] - play.api.Play - Application started (Dev)
v1=None, v2=None
这两种情况都没有打印,我希望看到存储在env变量中的值


谢谢你的帮助

我提出的一个可能的解决方案(或者更确切地说是解决方法…)是以下内容,我创建了一个包含以下内容的dev env文件:

-DVAR1=a \
-DVAR2=b \
-DVAR3=c
以及包含以下内容的运行开发人员可执行脚本:

activator ~run `cat dev-env`
这使我可以拥有单独的开发人员设置,而不必在conf/application.conf中硬编码任何内容


不幸的是,如果不显式地将环境变量传递给activator(在后台,这些变量被传递给jvm),我就无法让activator~运行以读取环境变量。

我认为答案可能在于如何设置环境变量。来模拟你的体验

使用的application.conf

foo.bar=${?foo}

然后

至关重要的是,如果您像下面的代码段中那样导出环境变量,那么就可以实现预期的行为

$ unset FOO
$ echo $FOO

$ export FOO=ASDF
$ activator ~run
[info] Loading project definition from /Users/pw/dev/play-project/project
[info] Set current project to play-project (in build file:/Users/pw/dev/play-project/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[success] Compiled in 1s
[info] - application - Application is started!!! ****
[info] - play.api.Play - Application started (Dev)
v1=Some(ASDF)

我已经在2.4.x上测试过了。一切如你所愿。您从哪里调用
println(“v1=“+v1+”,v2=“+v2)
?您还可以尝试“activator-D AWS\u ACCESS\u KEY\u ID=ACCESS KEY ID~runI”在我的ApplicationController的getIndexPage函数中调用它。问题是我不想使用-D,因为这些env变量应该自动从环境中读取。我不想再次通过他们,并在另一个地方提到他们。所以即使不使用-D,它也适用于您?嗯,我今天晚些时候再考。您使用的激活器版本是什么?谢谢。我只是建议-D尝试隔离问题。在windows上通过git bash运行activator 1.3.5,在Mac上使用activator 1.3.6进行测试。我在游戏中也使用了同样的技巧!2.3.x。仔细检查您是否可以打印其他不依赖于env变量的自定义配置对不起,对我来说仍然不起作用,我需要显式使用-D。我想出了一个解决办法,我已经在下面发布了答案。谢谢你的帮助。我的激活器版本是相同的顺便说一句!你完全正确!呃,我有一个VAR1=a的dev env文件,在运行activator~run之前,我正在做,source dev env,但这使它仅对当前shell可用,它不会将VAR1放在环境中。这意味着我在回显$VAR1时得到“a”,但env|grep VAR1没有显示任何内容。如果我想在~run之前对文件进行源代码转换,那么我需要在文件中保存的是export VAR1。谢谢呃,愚蠢的小虫子;)有趣的是,它在Windows上似乎不起作用。无论我是否使用系统环境变量,似乎都无法使其与activator run一起工作。最后使用了-D选项。(顺便说一句,find-D选项似乎需要在run命令之前。)
$ unset FOO
$ echo $FOO

$ export FOO=ASDF
$ activator ~run
[info] Loading project definition from /Users/pw/dev/play-project/project
[info] Set current project to play-project (in build file:/Users/pw/dev/play-project/)

--- (Running the application, auto-reloading is enabled) ---

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[success] Compiled in 1s
[info] - application - Application is started!!! ****
[info] - play.api.Play - Application started (Dev)
v1=Some(ASDF)