如何为凤凰框架项目加载环境变量

时间:2017-02-15 18:41:37

标签: elixir phoenix-framework

我创建了一个Phoenix应用程序然后添加了用于发送电子邮件的Bamboo模块,我今天下午使用Elixir成功发送了我的第一封电子邮件,但我不得不硬编码用户名密码< / em>进入config.exs

我读了this article并在我的phoenix项目的根目录中设置了一个.env文件,我试图在config.exs文件中使用以下语句加载环境变量

username: System.get_env("SMTP_USERNAME"),
password: System.get_env("SMTP_PASSWORD"),

然而,电子邮件没有被发送,竹子给了我一个相当神秘的错误信息。

我正在使用终端

中的以下命令构建凤凰应用程序
iex -S mix

我手动在iex会话中发送电子邮件,其命令类似于下面的命令,

CrjApi.Email.hello_text_email("me@example.com") |> CrjApi.Mailer.deliver_now

但只有在用户名/密码被硬编码到config.exs文件中时才会发送电子邮件。如何使用我设置的.env文件,以便我不必将用户名/密码硬编码到config.exs

注意: 我正在运行OS X,并使用鱼壳。

4 个答案:

答案 0 :(得分:9)

您可以在项目中使用confex模块。 https://github.com/Nebo15/confex

这是一个帮助程序模块,为您提供在运行时读取env配置的选项。

config.exs示例

config :app_name,
  smtp_username:  {:system, "SMTP_USERNAME", "default_user_name"},
  smtp_password:  {:system, "SMTP_PASSWORD", "default_password"}

在你的模块中

username = Confex.get(:app_name, :smtp_username)
password = Confex.get(:app_name, :smtp_password)

进入你的iex类型

System.put_env("SMTP_USERNAME", "real_username")
System.put_env("SMTP_PASSWORD", "real_password")

答案 1 :(得分:2)

我最终在smtp.exs目录中创建了一个config文件,如下所示:

<强> smtp.exs

use Mix.Config

config :crj_api, CrjApi.Mailer,
  username: "foo",
  password: "secret_password"

然后将以下内容添加到config.exs

import_config "smtp.exs"

现在,当我使用iex -S mix加载应用程序时,它每次都会加载这些应用程序变量,并且我没有源为每个终端会话的环境变量。

答案 2 :(得分:0)

就像你写的文章一样,我从我的系统中使用ENV vars for Phoenix。只需通过导出创建它们:

export SMTP_USERNAME=you_variable

依此类推,菲尼克斯会把它们看到并在服务器启动时间到达。 也可以使用.env文件,但我只使用'heroku local'。

检查这个十六进制dotenv_elixir,但它确实不是灵丹妙药。

答案 3 :(得分:0)

您可以将所有环境变量放在一个名为.env.dev.env.prod的文件中(不要忘记将.env.*添加到.gitignore文件中):

export SMTP_DOMAIN=smtp.trumpy.xyz
export SMTP_USERNAME=donny@trumpy.xyz
export SMTP_PASSWORD=donny123
export SMTP_PORT=587
...

加载该文件并运行Phoenix服务器:

source .env.dev && mix phx.server

请记住使用此语法

port: {:system, "SMTP_PORT"},
username: {:system, "SMTP_USERNAME"},

代替这个

port: System.get_env("SMTP_PORT"),
username: System.get_env("SMTP_USERNAME"),

以便在运行时加载ENV变量。