查看源代码 config

配置文件。

描述

一个配置文件包含系统中应用程序的配置参数值。 erl 命令行参数 -config Name 告诉系统使用系统配置文件 Name.config 中的数据。

erl 命令行参数 -configfd 的工作方式与 -config 选项相同,但指定一个文件描述符来读取配置数据,而不是文件。

来自配置文件和文件描述符的配置数据按照它们在命令行中给出的顺序读取。例如,erl -config a -configfd 3 -config b -configfd 4 将导致系统按照以下顺序读取配置数据:a.config、文件描述符 3b.config 和文件描述符 4。如果一个配置参数在给定的文件和文件描述符中多次指定,则最后一个会覆盖前面的参数。

配置文件或文件描述符中的配置参数值会覆盖应用程序资源文件中的值(请参阅 app(4))。 配置文件中的值总是被命令行标志覆盖(请参阅 erts:erl(1))。

通过调用 application:get_env/1,2 来检索配置参数的值。

文件语法

配置文件应命名为 Name.config,其中 Name 可以是任何名称。

.config 文件包含一个 Erlang 项,并具有以下语法

[{Application1, [{Par11, Val11}, ...]},
 ...
 {ApplicationN, [{ParN1, ValN1}, ...]}].
  • Application = atom() - 应用程序名称。

  • Par = atom() - 配置参数的名称。

  • Val = term() - 配置参数的值。

sys.config

在嵌入模式下启动 Erlang 时,假设只使用一个名为 sys.config 的系统配置文件。此文件应位于 $ROOT/releases/Vsn 中,其中 $ROOT 是 Erlang/OTP 根安装目录,Vsn 是发布版本。

发布处理依赖于此假设。安装新的发布版本时,将读取新的 sys.config 并用于更新应用程序的配置。

这意味着指定另一个 .config 文件或多个 .config 文件会导致应用程序配置的不一致更新。但是,有一种方法可以从 sys.config 中指出其他配置文件。如何做到这一点将在下一节中描述。

从 sys.config 和 -configfd 配置中包含文件

有一种方法可以从 sys.config 文件和从使用 -configfd 命令行参数指定的文件描述符获取的配置中包含其他配置文件。

包含文件的语法可以用 Erlang 类型语言 描述如下

[{Application, [{Par, Val}]} | IncludeFile].
  • IncludeFile = string() - .config 文件的名称。可以省略扩展名 .config。建议使用绝对路径。如果在 sys.config 中使用相对路径,则首先相对于 sys.config 目录搜索 IncludeFile,然后相对于模拟器的当前工作目录搜索。如果在 -configfd 配置中使用相对路径,则首先相对于包含 引导脚本 的字典(另请参阅模拟器的 -boot 命令行参数)搜索 IncludeFile,然后相对于模拟器的当前工作目录搜索。这使得可以使用 sys.config 来指出发布版本或其他 .config 文件,或者使用 -config-configfd 手动启动的节点,无论当前工作目录是什么,结果都相同。

当遍历 sys.config-configfd 配置的内容并遇到文件名时,会读取其内容并与到目前为止的结果合并。当找到应用程序配置元组 {Application, Env} 时,它会与到目前为止的结果合并。合并意味着添加新参数并覆盖现有参数值。

示例

sys.config:

["/home/user/myconfig1"
 {myapp,[{par1,val1},{par2,val2}]},
 "/home/user/myconfig2"].

myconfig1.config:

[{myapp,[{par0,val0},{par1,val0},{par2,val0}]}].

myconfig2.config:

[{myapp,[{par2,val3},{par3,val4}]}].

这将为 myapp 产生以下环境

[{par0,val0},{par1,val1},{par2,val3},{par3,val4}]

如果 sys.config-configfd 配置中指定的包含文件不存在或有错误,则运行时系统会在启动之前中止。但是,如果在加载包含文件时出现错误,安装新发布版本不会失败,但会返回错误消息并忽略错误文件。

另请参阅

app(4), erts:erl(1), OTP 设计原则