我正在开发一个监控应用程序,我必须在启动时传入一些初始配置,其中包含几个IP地址列表。将这些数据传递给应用程序的OTP方式是什么 - 通过.app文件还是有其他普遍接受的方式?
答案 0 :(得分:8)
配置文件包含配置参数的值 系统中的应用程序。 erl命令行参数-config Name告诉系统使用系统配置文件中的数据 Name.config。
配置文件中的配置参数值将覆盖 应用程序资源文件中的值(请参阅app(4))。价值 在配置文件中可以通过命令行标志覆盖(请参阅 ERL(1))。
通过调用检索配置参数的值 应用:get_env / 1,2
如果您需要在运行时覆盖它们,可以使用application:set_env/3
,但要小心。
答案 1 :(得分:1)
答案 2 :(得分:0)
我会创建一个名称gen_server进程,其中包含一个ip地址列表作为其状态。在服务器的init中,将使用file:consult从文件中读取预定义列表,并将其用作服务器的初始状态。要从此命名的gen_server获取IP地址列表,需要执行handle_call(get_ip,_From,State)。
通过这种方式,您可以防止共享的全局状态,从而为您提供出色的Erlang业力,并为运行时IP地址更改等附加功能提供更好的起点。
答案 3 :(得分:0)
使用您将数据作为erlang术语的文件。但是,您需要保护文件。在启动时从文件中读取使用:file:consult/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}).
使用函数protect_file/1
将文件设为只读。如果您需要使文件可写,则使用unprotect_file/1
进行修改。具有erlang术语的文件更容易,因为您不需要解析。您还可以将配置作为JSON
对象或XML
数据写入文件。总之,您的应用程序以及与之交互的人员可以更好地管理所有配置文件。
一个例子是ejabberd.cfg文件,ejabberd服务器的配置文件。对于带有erlang术语的文件最简单,因为您可以在这里和那里进行评论,以便系统管理员查看有关特定配置的其他可用选项。