Erlang存储初始应用程序配置

Erlang存储初始应用程序配置,erlang,Erlang,我正在开发一个监控应用程序,我必须在启动时提交一些初始配置,其中包括两个IP地址列表。OTP通过.app文件将数据传递给应用程序的方式是什么?或者是否有其他通用的方式?您可以通过多种方式处理配置。 这里是另一个stackoverflow的链接 我建议使用.app文件,或者您可以使用配置文件(stackoverflow主题的另一个链接)我将创建一个名为gen_的服务器进程,该进程的状态为ip地址列表。在服务器的init中,将使用从文件中读取预定义列表,并将其用作服务器的初始状态。要从这个命名的ge

我正在开发一个监控应用程序,我必须在启动时提交一些初始配置,其中包括两个IP地址列表。OTP通过.app文件将数据传递给应用程序的方式是什么?或者是否有其他通用的方式?

您可以通过多种方式处理配置。 这里是另一个stackoverflow的链接


我建议使用.app文件,或者您可以使用配置文件(stackoverflow主题的另一个链接)

我将创建一个名为gen_的服务器进程,该进程的状态为ip地址列表。在服务器的init中,将使用从文件中读取预定义列表,并将其用作服务器的初始状态。要从这个命名的gen_服务器获取ip地址列表,需要实现handle_调用(get_ip,_from,State)

通过这种方式,您可以防止共享全局状态,这会给您带来巨大的Erlang业力,并为添加运行时ip地址更改等功能提供更好的起点。

使用:

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

配置文件中的配置参数值将覆盖 应用程序资源文件中的值(请参阅应用程序(4))。价值观 在配置文件中,可以由命令行标志覆盖(请参阅 erl(1))

通过调用 应用程序:获取_env/1,2


如果您需要在运行时覆盖它们,可以使用,但要小心。

使用一个文件,其中包含您的数据作为erlang术语。但是,您需要保护该文件。在启动时读取文件使用:
文件:查阅/1
。如果用户或系统管理员将修改文件,请使用以下功能保护或拒绝访问文件:

-include_lib("kernel/include/file.hrl"). protect_file(File)-> {_,File_info} = file:read_file_info(File), file:write_file_info(File,File_info#file_info{access = read,mode = 33060}). unprotect_file(File)-> {_,File_info} = file:read_file_info(File), file:write_file_info(File,File_info#file_info{access = read_write,mode = 33206}). -include_lib(“kernel/include/file.hrl”)。 保护_文件(文件)-> {{uu,File\u info}=File:read\u File\u info(File), file:write_file_info(file,file_info#file_info{access=read,mode=33060})。 取消保护_文件(文件)-> {{uu,File\u info}=File:read\u File\u info(File), file:write_file_info(file,file_info#file_info{access=read_write,mode=33206})。
使用函数
protect_file/1
将文件设置为只读。如果需要使文件可写,请使用
unprotect\u file/1
进行修改。使用erlang术语的文件更容易,因为您不需要解析。您还可以将配置作为
JSON
对象或
XML
数据写入文件。总之,应用程序和与之交互的人可以更好地管理所有配置的文件。

例如ejabberd.cfg文件,ejabberd服务器的配置文件。使用带有erlang术语的文件是最简单的,因为您可以在这里和那里进行注释,以便系统管理员查看有关特定配置的其他可用选项。

我想还没有人回答这个问题,即“是否有OTP方法将参数传递给启动的erlang节点?”。我也在解决这个问题,因为我希望有一个可以用我想要的env变量以编程方式启动的节点。想到三种方法:1)在启动节点之前修改“.config”或“*.app”文件;2) 在节点创建期间,将这些参数作为“-Application Key Value”标志传递;3) 让应用程序保持空白状态,等待配置消息以启动其功能。我还是不知道该用什么,不过……什么才算是“小心”?请您详细说明一下,好吗?“小心”->当节点重新启动时,运行时设置的环境变量将重置为其初始值。如果运行时所做的更改没有反映在版本控制的配置文件中,那么也很难跟踪这些更改。为什么这被否决了?我也想知道,我已经用了很长时间了
Ejabberd
也使用此选项,甚至
Riak
e.t.c人有什么问题?-1,因为保护文件实际上并不能解决OP的问题。