【问题标题】:Play Framework 2.4.x - activator ~run does not substitute env vars in application.confPlay Framework 2.4.x - activator ~run 不能替代 application.conf 中的环境变量
【发布时间】:2015-11-01 23:30:05
【问题描述】:

我正在 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 变量中的值。

感谢您的帮助!

【问题讨论】:

  • 我已经在 2.4.x 上测试过了。按您的预期工作。你从哪里打电话给println("v1=" + v1 + ", v2=" + v2)?你也可以试试'activator -D AWS_ACCESS_KEY_ID=access-key-id ~run
  • 我在我的 ApplicationController 的 getIndexPage 函数上调用它。问题是我不想使用 -D 因为AFAIK应该自动从环境中读取这些环境变量。我不想再次通过它们并在另一个地方提及它们。所以即使没有 -D 使用它也适用于你?嗯,今天晚些时候我会重新测试。你用什么激活器版本?谢谢。
  • 我只是建议使用 -D 来尝试隔离问题。使用通过 git-bash 在 windows 上运行的激活器 1.3.5 和在 Mac 上运行 1.3.6 进行测试。我也在 Play 中使用了相同的技术! 2.3.x。仔细检查你可以打印一些其他不依赖于环境变量的自定义配置
  • 对不起,我还是不行,我需要明确使用-D。我现在想出了一个解决方法,我在下面发布了答案。不过感谢您的帮助。顺便说一句,我的激活器版本是相同的!

标签: playframework typesafe-activator


【解决方案1】:

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

使用

的 application.conf

foo.bar=${?FOO}

然后

$ FOO=BAR
$ 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 687ms
[info] - application - Application is started!!! ****
[info] - play.api.Play - Application started (Dev)
v1=None

至关重要的是,如果您像下面的 sn-p 那样导出环境变量,则可以实现预期的行为

$ 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)

【讨论】:

  • 你完全正确!嗯,我有一个带有 VAR1=a 的文件 dev-env,并且在运行 activator ~run 之前我正在执行 source dev-env,但这使它仅可用于当前 shell,它不会将 VAR1 放入环境中。这意味着当我回显 $VAR1 时我得到“a”,但是 env | grep VAR1 什么也没显示。如果我想在 ~run 之前获取它,我需要在我的文件中包含导出 VAR1。谢谢。嗯,愚蠢的简单错误;)
  • 有趣的是,它似乎不适用于 Windows。无论我是否使用系统环境变量,似乎都无法让它与激活器一起运行。最终使用 -D 选项。 (顺便说一句,Found -D 选项似乎需要在运行命令之前。)
【解决方案2】:

我想出的一种可能的解决方案(或者更确切地说是变通方法......)如下,我创建了一个包含内容的 dev-env 文件:

-DVAR1=a \
-DVAR2=b \
-DVAR3=c

和一个带有内容的 run-dev 可执行脚本:

activator ~run `cat dev-env`

这让我可以拥有单独的开发设置,而无需在 conf/application.conf 中硬编码任何内容。

不幸的是,我不能让 activator ~run 来读取环境变量,而无需明确地将它们传递给激活器(在后台,这些被传递给 jvm)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多