【问题标题】:How to get a variable value from Environment files in Phoenix?如何从凤凰城的环境文件中获取变量值?
【发布时间】:2019-03-06 08:57:42
【问题描述】:

我正在部署我的第一个 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"

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    好的,找到了一些东西。 Elixir's Application.get_env/3 是要走的路:

    get_env(app, key, default \\ 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]
    

    【讨论】:

    • 关于“访问器命令变得很长”:您总是可以围绕您经常重复的一长行代码编写一个包装函数。
    • 在不同的、更小的应用名称下定义它们可能是另一种选择。查看更新的答案。
    • 您应该只为您拥有的应用程序定义应用程序配置。如果您使用config :not_actuall_an_app, :key, :value,则不受支持,并且在某些情况下可能会中断。
    • 环境变量应该是秘密的......?将它们直接放入config.exs 会不会使它们在源代码控制中可用,从而破坏了环境变量的目的?
    • 不一定是@thedanotto。我可能只需要为不同的环境使用不同的值,无论是否保密。
    【解决方案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-05-03
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 2015-09-06
      • 2017-07-21
      相关资源
      最近更新 更多