18

我正在部署我的第一个 Phoenix 应用程序,并且我已经在我的环境文件 (dev.exsprod.exs) 中指定了一个变量的值。

现在我试图弄清楚如何在我的控制器中访问它们。

# config/dev.exs
config :my_app, MyApp.Endpoint,
  http: [port: 4000],
  debug_errors: true,
  cache_static_lookup: false,
  my_var: "DEVELOPMENT VALUE"

# config/prod.exs
config :my_app, MyApp.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: "example.com"],
  my_var: "PRODUCTION VALUE"
4

2 回答 2

28

好的,找到了一些东西。长生不老药 Application.get_env/3是要走的路:

get_env(app, key, 默认 \\ nil)


但是这样做的问题是访问器命令在当前情况下变得很长:

# Set value in config/some_env_file.exs
config :my_large_app_name, MyLargeAppName.Endpoint,
  http: [port: {:system, "PORT"}],
  url: [host: "example.com"],
  my_var: "MY ENV VARIABLE"

# Get it back
Application.get_env(:my_large_app_name, MyLargeAppName.Endpoint)[:my_var]

更好的方法是在单独的部分中定义它们:

config :app_vars,
  a_string: "Some String",
  some_list: [a: 1, b: 2, c: 3], 
  another_bool: true

并像这样访问它们:

Application.get_env(:app_vars, :a_string)
# => "Some String"

或者您可以获取list所有键值对中的一个:

Application.get_all_env(:app_vars)           
# => [a_string: "Some String", some_list: [a: 1, b: 2, c: 3], another_bool: true]
于 2015-06-23T07:10:45.137 回答
2

我对@sheharyar 解决方案有一些错误,所以这里的意思是:

我不得不在没有的情况下创建新块MyLargeAppName.Endpoint,

# Set value in config/some_env_file.exs
config :my_large_app_name,
  my_var: "MY ENV VARIABLE"

然后在你的代码中

Application.get_env(:my_large_app_name, :my_var)

警告:正如@José Valim 所说,您不能将任何名称设置为键:my_large_app_name,它必须与您的项目相同

于 2016-08-21T15:06:22.727 回答