如何从凤凰城的环境文件中获取变量值?

She*_*yar 18 elixir phoenix-framework

我正在部署我的第一个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"
Run Code Online (Sandbox Code Playgroud)

She*_*yar 24

好的,找到了一些东西.Elixir 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]
Run Code Online (Sandbox Code Playgroud)

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

config :app_vars,
  a_string: "Some String",
  some_list: [a: 1, b: 2, c: 3], 
  another_bool: true
Run Code Online (Sandbox Code Playgroud)

并像这样访问它们:

Application.get_env(:app_vars, :a_string)
# => "Some String"
Run Code Online (Sandbox Code Playgroud)

或者您可以获取list所有键值对:

Application.get_all_env(:app_vars)           
# => [a_string: "Some String", some_list: [a: 1, b: 2, c: 3], another_bool: true]
Run Code Online (Sandbox Code Playgroud)

  • 您应该只为您拥有的应用程序定义应用程序配置.如果你执行`config:not_actuall_an_app,:key,:value`,则不支持它,在某些情况下它可能会中断. (30认同)
  • 关于"访问器命令变得非常长":您总是可以围绕经常重复的一长串代码编写包装函数. (5认同)