2017-05-08 26 views
1

我有一个在Heroku上运行的Phoenix 1.2应用程序,它带有一个ENV变量,用于设置我希望发送电子邮件的电子邮件地址。在Heroku中更改ENV变量并不会改变它们在Phoenix应用程序中

当我改变环境变量的值,似乎并不需要;只有在我进行公关并重新部署之后,这个新的变化才会出现。

这使得它看起来像我需要以某种方式“重新加载”代码或内存。因此,2个问题:

  1. 为什么会发生这种情况?

  2. 有关如何解决它的任何想法?

+0

您正在使用什么buildpacks?你的代码是否使用'System.get_env/1'? –

回答

3

我假设你在config文件设置您的ENV值,并使用Application.get_env访问它们在你的应用程序。


Elixir应用程序被编译,而不是解释。当您将应用程序部署到heroku时,它会使用可用的环境变量编译它们,并将它们硬编码到应用程序中。所以,即使重新启动应用程序也不行。它需要用新的环境变量重新编译。

这里有几个解决方案:

  • 你可以,如果你使用Exrm构建版本使用RELX_REPLACE_OS_VARS=true;

  • 使用System.get_env取代ENV变量,但这不起作用,除非应用程序在更改环境配置后重新启动;

  • 使用simple wrapper module可让您使用环境配置,方法是指定它们,如{:system, "MY_VARIABLE"}; config.exs;

  • 或使用现有的包像ConfexConform来管理你的配置

+0

我可以在'iex'控制台内部执行'IEx.Helpers.recompile'并在更改ENV变量后重新编译应用程序吗? – Nona

+1

我不这么认为。因为当你执行一个程序时,它会收到你的shell和env vars的“副本”(或者至少这就是我所理解的)。 – Sheharyar