environment-variables - Distillery 不替换环境变量

标签 environment-variables elixir phoenix-framework distillery

在我使用 distillery 进行发布的伞式项目中,我有一个 db 应用程序 config ,其中包含以下内容:

config :main, Main.Repo,
  adapter: Ecto.Adapters.Postgres,
  username: "${DB_USERNAME}",
  password: "${DB_PASSWORD}",
  database: "${DB_NAME}",
  hostname: "${DB_HOST}",
  pool_size: 10

由于我在构建中设置了 REPLACE_OS_VARS=true,因此可以正确读取环境变量来配置数据库。

我在电子邮件应用程序中进行了类似的设置,其配置如下:

config :email, from_email: "${FROM_EMAIL}"

然后我希望从我的电子邮件应用程序内部访问它,如下所示:

@from_email Application.get_env(:email, :from_email)

但是@from_email的值是“${FROM_EMAIL}”而不是我为FROM_EMAIL设置的环境变量。

我不太熟悉酒厂的工作原理,并且不确定以这些类似的方式传递这些环境变量是如何导致它以不同的方式读取的。

如果能了解为什么会发生这种情况,我们将不胜感激。


编辑:

我们能够在 distillery 编译时传递 $FROM_EMAIL 环境变量,但我们希望在运行时传递它。 我们可以在db应用程序中执行此操作,但由于某种原因无法在email应用程序中执行此操作。

最佳答案

直接在模块定义内部(即外部 def)的代码在编译时进行评估。您需要在运行时调用 Application.get_env 来获取正确的值:

添加:

def from_email, do: Application.get_env(:email, :from_email)

到模块,然后将模块中所有@from_email更改为from_email()

关于environment-variables - Distillery 不替换环境变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48886137/

相关文章:

python - 将 DJANGO_SETTINGS_MODULE 永久设置为 Windows 中的环境变量

docker - 如何调试使用docker运行的phoenix应用程序?

elixir - 在 Elixir 中附加到文件的最佳方法是什么

elixir - ExUnit 中 `let` 的模拟

bash - 在 awk 中设置 bash 变量

Haskell:为什么在 cabal 下运行我的项目时我的环境变量不可用?

phoenix-framework - 如何在 Phoenix 框架中连接两个标签?

pattern-matching - Elixir Phoenix 模式匹配 "params"

ruby - Ubuntu Launcher 未使用 RVM

Elixir:如何避免深度嵌套的 case 语句?