【问题标题】:Set & load environment variables in a phoenix app在 phoenix 应用程序中设置和加载环境变量
【发布时间】:2017-12-10 11:59:29
【问题描述】:

我是 Phoenix 框架的新手,正在寻找一种在应用程序中设置环境变量的方法。我找到的一种方法是here

但是,我不喜欢这种方式,因为每次重新启动应用程序时我都需要输入 source .env

我尝试在prod.secret.exs 中设置 ENV 变量,如下所示:

config :oauth,
  GITHUB_CLIENT_ID: "(CLIENT ID)",
  GITHUB_CLIENT_SECRET: "(SECRET)"

我尝试通过以下方式检索 ENV 变量:

 config :ueberauth, Ueberauth.Strategy.Github.OAuth,
   client_id: System.get_env("GITHUB_CLIENT_ID"),
   client_secret: System.get_env("GITHUB_CLIENT_SECRET")

但是,当我使用 mix phoenix.server 运行服务器时,它给了我一个如下所示的错误,我不确定它的真正含义:

You have configured application :oauth in your configuration
file, but the application is not available.

This usually means one of:

1. You have not added the application as a dependency in a mix.exs file.

2. You are configuring an application that does not really exist.

Please ensure :oauth exists or remove the configuration.

我正在寻找一种将项目本身中的 ENV 变量保存在隐藏文件中的方法,以便可以随时检索它。谁能告诉我保存 ENV 变量并在 Phoenix 应用程序中检索它们的正确方法是什么?

【问题讨论】:

  • config :oauth, GITHUB_CLIENT_ID: "(CLIENT ID)"不会设置 ENV 变量。也许你想要github.com/avdi/dotenv_elixir
  • @Dogbert,我读过它,但我不觉得这不是设置 ENV 变量的 Elixir 方法。我在寻找更多的本地(?)方式。
  • 您是否将其作为 linux 服务(如 upstart 或 sytemd)的一部分运行?因为如果你是为什么要关心如何将秘密值带入你的应用程序。只需选择一个解决方案并继续编码。

标签: elixir phoenix-framework


【解决方案1】:

我找到了另一个例子

1.- 在主文件夹中创建一个文件.env

2.- 在.env 文件中添加环境变量

# Example:
# MyApp/.env file
export GITHUB_CLIENT_ID="testID"
export GITHUB_SECRET_CLIENT_ID="testSecretID"

3.- 运行source .env,每次修改后,再次执行命令,也可能在重启中

4.- 真正重要 - 不要忘记将您的秘密文件添加到MyApp/.gitignore

# add this at the end
/.env

5.- 运行凤凰服务器mix phx.servermix phoenix.server

您可以使用

进行测试
iex -S mix phoenix.server

iex> System.get_env("GITHUB_CLIENT_ID")
"testID"

帮助链接:

Environment variable error
Documentation of config

【讨论】:

  • 这对我来说已经足够好了,并且可以将系统配置排除在长生不老药代码之外。很容易定义包含各种秘密的单独 .env 文件。谢谢!
【解决方案2】:

您正在尝试执行的操作有两个主要故障:

首先,您正在尝试指示mix 配置oauth OTP 应用程序,而您需要配置自己的应用程序:

config :my_app, :oauth,
  github_client_id: "(CLIENT ID)",
  github_client_secret: "(SECRET)"

现在在你的主配置中你可以这样做:

config :ueberauth, Ueberauth.Strategy.Github.OAuth,
   client_id: Application.get_env(:my_app, :oauth)[:github_client_id],
   client_secret: Application.get_env(:my_app, :oauth)[:github_client_secret]

第二个故障是GITHUB_CLIENT_ID 是一个原子,而您最近正试图以字符串的形式访问它。一般来说,不应该使用以大写开头的原子名称,因为它们有点保留给模块名称。

另一方面,假设值之前放置在环境中,您可能仍然使用System.get_env/2(与您的config.ex,):

prod.secret.exs(因为它仍然是普通的 Elixir)

System.put_env("GITHUB_CLIENT_ID", "(CLIENT ID)")
System.put_env("GITHUB_CLIENT_SECRET", "(CLIENT SECRET)")

【讨论】:

  • 我尝试了两种方法,似乎没有设置 ENV 变量:/ 当我按照你的方式运行 Application.get_env(:my_app, :oauth)[:github_client_id]System.get_env("GITHUB_CLIENT_ID") 时,iex -S mix phoenix.server 仍然为零。
  • 1) 在系统 shell 环境中,2) prod.secret.exs 足够好,3) 不知道,我从来没有用 System.put_env 这样做过,我建议这是因为系统环境在加载时mix 甚至 erlang VM 启动,或类似。
  • Application.get_env(:my_app, :oauth)[:github_client_id] 不能是nilSystem.get_env 可以而且可能是,因为竞争条件/环境负载的顺序。
  • 请确保您从config/prod.ex import_config "prod.secret.exs" 之前请求Application.get_env
  • Application.get_env 的请求仍然为零,我现在正在关注config :my_app, :oauth。你认为我得到nil是因为我在config.exs中请求Application.get_env而不是prod.exs吗?
【解决方案3】:

在启动 phoenix 并使用环境变量 (System.get_env("GITHUB_CLIENT_ID")) 时,您需要执行以下操作来传递变量:

GITHUB_CLIENT_ID=12345 GITHUB_CLIENT_SECRET=67890 mix phoenix.server

【讨论】:

  • 这是 OP 第一句中明确提到的已知但不想要的方式。
猜你喜欢
  • 2017-11-14
  • 2012-10-03
  • 2012-06-08
  • 2017-11-14
  • 2016-10-08
  • 2014-08-02
  • 2019-10-25
  • 1970-01-01
  • 2020-02-13
相关资源
最近更新 更多