查看源代码 Config (Elixir v1.16.2)
一个简单的基于关键字的配置 API。
示例
此模块最常用于定义应用程序配置,通常在 config/config.exs
中
import Config
config :some_app,
key1: "value1",
key2: "value2"
import_config "#{config_env()}.exs"
import Config
将导入函数 config/2
,config/3
config_env/0
,config_target/0
和 import_config/1
来帮助你管理配置。
config/2
和 config/3
用于为给定应用程序定义键值配置。Mix 启动后,它将自动评估配置文件并将上面的配置持久化到 :some_app
的应用程序环境中,可以在以下位置访问:
"value1" = Application.fetch_env!(:some_app, :key1)
最后,import_config "#{config_env()}.exs"
行将根据当前配置环境导入其他配置文件,例如 config/dev.exs
和 config/test.exs
。
Config
还提供了一个低级 API 用于评估和读取配置,位于 Config.Reader
模块下。
避免在库中使用应用程序环境
如果你正在编写一个供其他开发者使用的库,一般建议避免使用应用程序环境,因为应用程序环境实际上是一个全局存储。还要注意,当库用作依赖项时,库的
config/config.exs
不会被评估,因为配置始终用于配置当前项目。有关更多信息,请阅读我们的 库指南。
从 use Mix.Config
迁移
Elixir 中的 Config
模块是在 v1.9 中引入的,作为 use Mix.Config
的替代品,后者是 Mix 特有的并且已被弃用。
你可以利用 Config
来代替 use Mix.Config
,分三步。第一步是用 import Config
替换配置文件顶部的 use Mix.Config
。
第二步是确保你的 import_config/1
调用没有通配符。如果有,你需要手动执行通配符查找。例如,如果你做了
import_config "../apps/*/config/config.exs"
它必须被替换为
for config <- "../apps/*/config/config.exs" |> Path.expand(__DIR__) |> Path.wildcard() do
import_config config
end
最后一步是用 config_env()
替换配置文件中的所有 Mix.env()
调用。
请记住,你还必须避免在项目文件中使用 Mix.env()
。要在运行时检查环境,可以添加一个配置键
# config.exs
...
config :my_app, env: config_env()
然后,在其他脚本和模块中,你可以使用 Application.fetch_env!/2
获取环境
# router.exs
...
if Application.fetch_env!(:my_app, :env) == :prod do
...
end
你可以从 Mix
模块访问函数的唯一文件是 mix.exs
文件和自定义 Mix 任务内部,这些任务始终位于 Mix.Tasks
命名空间内。
config/runtime.exs
对于运行时配置,你可以使用 config/runtime.exs
文件。它在 Mix 和发布版(使用 mix release
组装)中应用程序启动之前立即执行。
摘要
函数
配置给定的 root_key
。
关键字列表始终被深度合并。
示例
给定的 opts
被合并到给定 root_key
的现有配置中。冲突的键将被 opts
中指定的键覆盖,除非它们是关键字,关键字将递归深度合并。例如,下面的应用程序配置
config :logger,
level: :warn,
backends: [:console]
config :logger,
level: :info,
truncate: 1024
将具有 :logger
的最终配置:
[level: :info, backends: [:console], truncate: 1024]
配置给定 root_key
的给定 key
。
关键字列表始终被深度合并。
示例
给定的 opts
被合并到给定 root_key
中 key
的现有值中。冲突的键将被 opts
中指定的键覆盖,除非它们是关键字,关键字将递归深度合并。例如,下面的应用程序配置
config :ecto, Repo,
log_level: :warn,
adapter: Ecto.Adapters.Postgres,
metadata: [read_only: true]
config :ecto, Repo,
log_level: :info,
pool_size: 10,
metadata: [replica: true]
将具有 :ecto
应用程序中 Repo
键的最终配置值:
Application.get_env(:ecto, Repo)
#=> [
#=> log_level: :info,
#=> pool_size: 10,
#=> adapter: Ecto.Adapters.Postgres,
#=> metadata: [read_only: true, replica: true]
#=> ]
返回此配置文件执行的环境。
在 Mix 项目中,此函数返回此配置文件执行的环境。在发布版中,返回 mix release
运行时的环境。
这最常用于执行条件代码
if config_env() == :prod do
config :my_app, :debug, false
end
返回此配置文件执行的目标。
这最常用于执行条件代码
if config_target() == :host do
config :my_app, :debug, false
end
从给定文件导入配置。
如果文件不存在,则会抛出错误。
如果文件是相对路径,它将相对于当前配置文件所在的目录进行展开。
示例
这通常用于模拟跨环境的配置
import_config "#{config_env()}.exs"
但是,请注意,一些配置文件(例如 config/runtime.exs
)不支持导入,因为它们旨在被复制到各个系统中。