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

ipa*_*tch 10 elixir phoenix-framework

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

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

username: System.get_env("SMTP_USERNAME"),
password: System.get_env("SMTP_PASSWORD"),
Run Code Online (Sandbox Code Playgroud)

但是,电子邮件没有发送,竹子给了我一个相当神秘的错误信息.

我正在使用终端中的以下命令构建phoenix应用程序,

iex -S mix
Run Code Online (Sandbox Code Playgroud)

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

CrjApi.Email.hello_text_email("me@example.com") |> CrjApi.Mailer.deliver_now
Run Code Online (Sandbox Code Playgroud)

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

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

小智 10

您可以在项目中使用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"}
Run Code Online (Sandbox Code Playgroud)

在你的模块中

username = Confex.get(:app_name, :smtp_username)
password = Confex.get(:app_name, :smtp_password)
Run Code Online (Sandbox Code Playgroud)

进入你的iex类型

System.put_env("SMTP_USERNAME", "real_username")
System.put_env("SMTP_PASSWORD", "real_password")
Run Code Online (Sandbox Code Playgroud)


Iwa*_* B. 8

您可以将所有环境变量放入名为例如.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
...
Run Code Online (Sandbox Code Playgroud)

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

source .env.dev && mix phx.server
Run Code Online (Sandbox Code Playgroud)

记住使用这个语法

port: {:system, "SMTP_PORT"},
username: {:system, "SMTP_USERNAME"},
Run Code Online (Sandbox Code Playgroud)

代替这个

port: System.get_env("SMTP_PORT"),
username: System.get_env("SMTP_USERNAME"),
Run Code Online (Sandbox Code Playgroud)

为了在运行时加载 ENV 变量。


ipa*_*tch 3

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

邮件传输协议

use Mix.Config

config :crj_api, CrjApi.Mailer,
  username: "foo",
  password: "secret_password"
Run Code Online (Sandbox Code Playgroud)

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

import_config "smtp.exs"

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

  • 我建议将此文件添加到 `.gitignore` (2认同)