2

在我使用酒厂进行发布的伞式项目中,我有一个具有以下内容的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在构建中设置的那样,正确读取环境变量会配置数据库。

app我在具有以下配置的电子邮件中进行了类似的设置:

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

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

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

但是 的值@from_email不是"${FROM_EMAIL}"我设置的环境变量FROM_EMAIL

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

关于为什么会发生这种情况的洞察力将不胜感激。


编辑

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

4

1 回答 1

3

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

添加:

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

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

于 2018-02-20T16:44:44.070 回答