1.OTP应用组织模式
创建OTP应用时的主要工作集中于保准目录结构的建立和应用元数据的编写。元数据的作用在于让系统获悉应该如何启动和停止应用,还可用于指定应用的依赖项,也就是在应用启动前必须安装或启动哪些其它应用。
2.OTP应用布局
<application-name>[-<version>]
|
| - doc
| - ebin
| - include
| - priv
| - src
otp应用布局目录。目录名可以包含版本号。标准子目录包括doc、ebin、include、priv、src,其中只有ebin是必须的。
————————————————————————————————————————————————————————————
doc: 用于存放文档。如果文档时用EDoc生成,请将overview.edoc文件放在此处,其余的文件将会自动生成。
ebin:用于存放编译后的代码(.beam文件)。包含应用元数据的.app文件也应放在此处。
include:用于存放公共头文件。所有作为公共API的一部分的.hrl文件都应该放在这个目录中。仅用于你自己的代码之中且不打算公开的私有.hrl文件则应该与其它源码文件一起放 在src文件中。
priv:用于存放各种需要随应用一起发布的其他内容。定位priv目录的方法很简单:调用code:priv_dir(<application-name>),便会以字符串形式得到priv目录完整路径。
src:用于存放应用源码。
3.OTP应用元数据
*.app ->
{application, tcp_rpc,
[{description, "RPC server for Erlang and OTP in action"},
{vsn,"0.1.0"},
{modules,[tr_app,
tr_sub,
tr_server]},
{registered,[tr_sup]},
{applications,[kenrel,stdlib]},
{mod,{tr_app,[]}}
]}
这个app文件告诉OTP如何启动应用,以及该应用如何与系统其它应用相融合。
.app文件格式很简单。除去注释,只剩下一个由句号结尾的的erlang项式:三元组{application,....,.....},其中第二个代表应用名字的原子,此处是rcp_rpc ,第三个参数是一个参数列表,其中每个参数都是由{key,value}对的形式。有些是必须的,有些是可选的。
——————————————————————————————————————————————————————————————————
description:针对应用的简短描述。
vsn:应用的版本
modules:应用中的模块列表,模块在列表中的顺序无所谓,但按照字典序对模块进行排序会较为易于维护。
registered:告诉OTP系统哪个进程注册名字,从而为系统升级等操作提供遍历,同时也可以尽早发现重复的注册名并发出警告
application:必须在该应用前先行启动的所有应用。应用往往会依赖于其它应用。主动应用要求自己所依赖的所有应用在自己的生命周期开始之前先行启动并就绪。列表中个应用的顺序无关紧要——OTP很智能,它会纵观整个系统并明辨每个应用的启动时机。
mod:告知OTP系统如何启动应用。该参数的值是一个元组,其内容为一个模块名以及一些可选的启动参数。这个模块必须实现application行为模式。
4.应用行为模式
应用行为模式的实现模块通常被命名为<application-name>_app
例如:
tr_app.erl
-module(tr-app).
-behaviour(application).
-export([
start/2
stop/1
]).
start(_Type, _StartArgs) ->
case tr_sup:start_link() of
{ok,Pid} ->
{ok,Pid};
Other ->
{error,Other}
end.
stop(_State) ->
ok.
5.应用结构小结
1.遵循标准目录结构
2.添加用于存在元数据的app文件
3.创建一个application行为模式实现模块,负责启动应用。