2015-11-01 56 views
2

我在heroku上運行我的Play應用程序。在heroku上的想法是通過env變量設置各種設置。例如AWS S3祕密訪問密鑰及其ID。這是可以理解的。因此,遵循良好的做法,我將以下設置放到我的conf/application.conf中:Play Framework 2.4.x - activator〜運行不會替代application.conf中的env vars

# AWS. 
# ~~~~~ 
aws.accessKeyID = ${?AWS_ACCESS_KEY_ID} 
aws.secretAccessKey = ${?AWS_SECRET_ACCESS_KEY} 

好吧,一切都很好。現在,無論何時我運行在PROD或DEV模式下,我都可以改變這些,而不用擔心對它們進行硬編碼。問題是,當我運行激活器〜運行本地開發我的應用程序時,這些設置不會被讀取和設置。這就像激活〜運行忽略完全替代env變量的選項。我已閱讀並以下列方式打印出來加載我的索引頁時:

import play.api.Play.current 
... 
val v1 = current.configuration.getString("aws.accessKeyID") 
val v2 = current.configuration.getString("aws.secretAccessKey") 
println("v1=" + v1 + ", v2=" + v2) 

讓我給甚至更多的細節來發生的事情:

[email protected]:~/myproj$ echo $AWS_ACCESS_KEY_ID 
access-key-id 
[email protected]:~/myproj$ echo $AWS_SECRET_ACCESS_KEY 
secret-access-key 
[email protected]:~/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變量中的值。

非常感謝您的幫助!

+0

我已經在2.4.x上測試了這個。按照您的期望工作。你從哪裏調用'println(「v1 =」+ v1 +「,v2 =」+ v2)'?你也可以試試'activator -D AWS_ACCESS_KEY_ID = access-key-id〜run – w4tson

+0

我在我的ApplicationController的getIndexPage函數上調用它。事情是我不想使用-D,因爲AFAIK這些env變量應該從環境中自動讀取。我不想再次通過他們,並在另一個地方提及他們。所以即使沒有-D用法,它也適用於你?嗯,今天晚些時候我會重新測試。你使用什麼激活版本?謝謝。 – flojdek

+0

我只是建議-D嘗試並隔離問題。使用激活器1.3.5進行測試,通過windows上的git-bash和Mac上的1.3.6進行測試。我也在Play中使用了相同的技巧! 2.3.x.仔細檢查你可以打印一些其他不依賴env的自定義配置var – w4tson

回答

1

我認爲答案可能在於如何設置環境變量。爲了模擬你的經驗

隨着

​​

然後

$ 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 

關鍵一application.conf如果您在下面的代碼片段導出環境變量一樣,預期的行爲是實現

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

你是完全正確的!呃,在運行activator〜run之前,我有一個帶有VAR1 = a的文件dev-env,source dev-env,但是它使它僅適用於當前shell,它不會將VAR1放入環境中。這意味着當我回顯$ VAR1時會得到'a',但是env | grep VAR1什麼都不顯示。我需要在我的文件中包含什麼內容,如果我想在運行前輸入它,那麼導出爲VAR1。謝謝。呃,愚蠢的簡單的錯誤;) – flojdek

+0

有趣的是,它似乎並沒有在Windows上工作。無論是否使用System環境變量,似乎都無法使其與激活器運行一起使用。結束使用-D選項。 (BTW Found -D選項似乎需要_precede_運行命令。) – wwkudu

1

一個可能的解決方案(或相當變通方法...)我想出瞭如下,我已經創建了內容的DEV-ENV文件:

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

和運行開發可執行腳本的內容:

activator ~run `cat dev-env` 

這讓我有獨立的開發設置,而不是硬編碼conf/application.conf內的任何東西。

不幸的是,我不能讓激活器運行來讀取env變量,而不會明確地將它們傳遞給激活器(這些都傳遞給jvm)。

相關問題