【问题标题】:How do I load environment variables for a phoenix framework project如何为 phoenix 框架项目加载环境变量
【发布时间】:2017-07-04 14:21:57
【问题描述】:

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

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

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

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

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

iex -S mix

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

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

但仅当用户名/密码硬编码到config.exs 文件中时才会发送电子邮件。如何使用我设置的.env 文件,这样我就不必将用户名/密码硬编码到config.exs 中?

注意:我正在运行 OS X,并使用 fish shell。

【问题讨论】:

  • 如果你进入iex并输入System.get_env("SMTP_USERNAME"),你得到期望值了吗?对密码执行相同操作。
  • @JustinWood 你建议的命令返回nil。感谢您为我指明正确的方向;)
  • 如果你严格按照每一步,这篇文章是有效的。 source .env 还是有错别字。

标签: elixir phoenix-framework


【解决方案1】:

您可以在项目中使用 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")

【讨论】:

    【解决方案2】:

    您可以将所有环境变量放在一个名为 .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 变量。

    【讨论】:

      【解决方案3】:

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

      smtp.exs

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

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

      import_config "smtp.exs"

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

      【讨论】:

      • 我建议将此文件添加到.gitignore
      【解决方案4】:

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

      export SMTP_USERNAME=you_variable

      以此类推,Phoenix 将在服务器启动时间获取它们并获取它们。 也可以使用 .env 文件,但我只将它与 'heroku local' 一起使用。

      检查这个十六进制 dotenv_elixir 但它真的不是灵丹妙药。

      【讨论】:

      • 他没有具体说明他使用的是 Windows 还是 Mac OSX/Linux。如果他在 Windows 上,命令将是 SET SMTP_USERNAME=your_variable
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 2023-01-30
      • 1970-01-01
      • 2013-10-07
      • 2019-06-06
      • 2017-12-10
      • 1970-01-01
      相关资源
      最近更新 更多