Erlang Application

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行为模式实现模块,负责启动应用。

Erlang Application,布布扣,bubuko.com

时间: 2024-08-04 16:09:11

Erlang Application的相关文章

[Erl_Question08] Erlang怎么构建一个application?

问题: 当我们把一个项目中所有的supervision tree通过一个简单的函数game: start(),会发现这个树结构特别复杂,只能有一个根节点,然后一直扩展. 这里,这就是application出现的原因,设计一个可以随时开关的子块(application).比如:上图中的log app, db app ,game app, connect app .. 这样对这些应用的开关管理就非常方便啦,[试想你如果用supervisor,运行时还要手动去停进程树,然后还要移除监控树,还要做cle

Getting Started with Erlang

Getting Started with Erlang Erlang is a great language that lets you build highly concurrent applications. This tutorial will teach you how to quickly get started with it. In this section: Preliminary steps Installing Erlang OTP Windows OS X Linux Ve

Erlang generic standard behaviours -- gen_server module

在分析完gen module 之后,就可以开始进入gen_server 的主体module 了.gen_server 的主体 module 暂不涵括terminate, hibernate, debug trace 相关的内容,这些会单独拉出来分析. gen_server 主要包括start 初始化部分, MAIN loop. 其中MAIN loop 为gen_server的主体结构, 其中,处理Label 为'$gen_call' (也就是handle_call)的消息使用handle_msg

RabbitMQ in Action (2): Running and administering Rabbit

Server management the Erlang node and the Erlang application Starting nodes multiple Erlang applications can run inside the same node an application on node asparagus can call functions in applications running on node artichoke as though those functi

启动erlang/OTP里面的Web服务器(application INETS启动过程代码分析)

上两篇分别用两种方式启动了inets中的httpd,其实本质一样的:下面简单分析一下过程,函数粒度的介绍. 1,下面是application inets的代码目录,虽然ftp.tftp.http_client.http_lib.http_server.inets_app在这目录中并列,其实inets_app扮演顶层控制角色: 只有inets_app是一个application,而其他都是module---application的一部分并且需要application启动和管理. [[email p

创建Erlang的Application

我们写完一组功能模块后(在erlang中,以module为单位),总是希望这一组模块,可以打包成一个应用,作为一个单独的整个,可以启动,停止,象mnesia一样.并可以在其它应用中引用.如何来做到这一点呢.每一个应用都是通过application:start系列函数来启动,application:stop可以停止一个应用. 一个应用需要一个.app文件来描述,主要描述它包括哪些文件,参数等. 如果在启动erlang的VM时就启动一个应用呢,实际上,我们是没有办法通过VM的参数来直接启动一个自定义

Erlang入门:构建application练习4(进程link的作用)

1.示例项目(bank)简介 bank_server.erl是为客户服务的进程回调模块 bank_center.erl是为银行服务中心的进程回调模块 客户(bank_server)每年都要扣除年费 所有年费都交给银行服务中心(bank_center) 客户服务使用示例: 创建用户:bank_server:create_account(myname, 100). 用户存钱:myname ! {deposit, 10}. 用户取钱:myname ! {cash1, 20}. myname ! {ca

Erlang入门:构建application练习5(监督树)

1.前言 在<Erlang入门:构建application练习4(进程link的作用)>一文中, 提到了一个问题: 如果系统进程内部发生了错误而异常退出,将会出现什么情况? 在application中,像bank_center这样的系统进程,如果终止了,整个系统就无法正常运行,为了让bank_center意外终止时能自动重启,这里就要请Erlang的监督树出来帮忙了. 演示项目bank3目录结构: 2.编写监督树回调模块bank_sup.erl 监督树的回调模块只有一个函数init/1 %%

Erlang入门:构建application练习1

1.定义application回调模块 %% 文件名为bank_app.erl -module(bank_app). %% 指定behaviour为application -behaviour(application). %% 导出application回调模块的函数 -export([start/2, stop/1]). %% 启动application时调用 start(_Type, _Args) -> ("Start ~p ...", [?MODULE]), {ok, se