查看源代码 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/2config/3 config_env/0config_target/0import_config/1 来帮助你管理配置。

config/2config/3 用于为给定应用程序定义键值配置。Mix 启动后,它将自动评估配置文件并将上面的配置持久化到 :some_app 的应用程序环境中,可以在以下位置访问:

"value1" = Application.fetch_env!(:some_app, :key1)

最后,import_config "#{config_env()}.exs" 行将根据当前配置环境导入其他配置文件,例如 config/dev.exsconfig/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

配置给定 root_key 的给定 key

返回此配置文件执行的环境。

返回此配置文件执行的目标。

从给定文件导入配置。

函数

链接到此函数

config(root_key, opts)

查看源代码 (自 1.9.0)

配置给定的 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]
链接到此函数

config(root_key, key, opts)

查看源代码 (自 1.9.0)

配置给定 root_key 的给定 key

关键字列表始终被深度合并。

示例

给定的 opts 被合并到给定 root_keykey 的现有值中。冲突的键将被 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]
#=> ]
链接到此宏

config_env()

查看源代码 (自 1.11.0) (宏)

返回此配置文件执行的环境。

在 Mix 项目中,此函数返回此配置文件执行的环境。在发布版中,返回 mix release 运行时的环境。

这最常用于执行条件代码

if config_env() == :prod do
  config :my_app, :debug, false
end
链接到此宏

config_target()

查看源代码 (自 1.11.0) (宏)

返回此配置文件执行的目标。

这最常用于执行条件代码

if config_target() == :host do
  config :my_app, :debug, false
end
链接到此宏

import_config(file)

查看源代码 (自 1.9.0) (宏)

从给定文件导入配置。

如果文件不存在,则会抛出错误。

如果文件是相对路径,它将相对于当前配置文件所在的目录进行展开。

示例

这通常用于模拟跨环境的配置

import_config "#{config_env()}.exs"

但是,请注意,一些配置文件(例如 config/runtime.exs)不支持导入,因为它们旨在被复制到各个系统中。