如何获取无关联模块的Elixir应用配置段?
获取Elixir应用的顶层无关联模块配置
嘿,你提的这个问题很常见,我来给你梳理一下解决办法!
首先,你说得没错,Application.get_env/1确实不存在,但我们有其他方法获取那些没有关联到具体模块的顶层配置:
方法1:使用Application.get_all_env/1获取全部配置
这个函数会返回指定应用的所有配置项,包括顶层的键值对和关联到模块的配置。比如针对你的配置:
config :my_app, a: 123, b: 456 config :my_app, MyApp.Endpoint, url: [host: "localhost"], secret_key_base: "fdsfdsfd"
你可以这样获取:
# 获取my_app的所有配置 all_config = Application.get_all_env(:my_app) # 提取顶层的a和b的值 a_value = Keyword.get(all_config, :a) # => 123 b_value = Keyword.get(all_config, :b) # => 456 # 同时你也能拿到模块相关的配置,和之前一样 endpoint_config = Keyword.get(all_config, MyApp.Endpoint)
方法2:过滤出仅顶层配置
如果只想拿到没有关联模块的顶层配置,不想包含模块对应的配置,可以加个过滤:
top_level_config = Application.get_all_env(:my_app) |> Keyword.reject(fn {key, _} -> is_atom(key) and Module.exists?(key) end) # 此时top_level_config就是 [a: 123, b: 456]
方法3:提前重构配置(推荐)
为了让配置结构更清晰,避免混淆,建议你把顶层配置放到一个专门的原子键下面,比如:
config :my_app, :app_global_settings, a: 123, b: 456
这样就能用熟悉的get_env直接获取:
cfg = Application.get_env(:my_app, :app_global_settings) # => [a: 123, b: 456] a_value = cfg[:a] # => 123
这种方式不仅更直观,还能避免和模块名冲突,后期维护也更方便。
内容的提问来源于stack exchange,提问作者Ojrojako
相关产品推荐
相关产品推荐

