`
hje
  • 浏览: 283581 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

erlang app 文件

阅读更多
应用的概念¶
当我们写了实现特定功能的代码之后,我们可能想将代码转成一个 应用 (application),这是可以作为一个单元启动和停止的组建,同时它也可以在其他系统中被重用。

我们要创建一个 应用回调模块 ,其中描述了该应用应该如何被启动和停止。

然后,需要一个应用规格,它被放在一个 应用资源文件 。我们还指定该应用由哪些模块组成,以及各个回掉模块的名字。

如果我们使用 systools ——Erlang/OTP用于打包的代码(参见 发布 ),每个应用的代码都可以按照预定的 目录结构 放在单独的目录中。

应用回调模块¶
如何启动和停止应用的代码,即监督树,由以下两个回掉函数来描述:

start(StartType, StartArgs) -> {ok, Pid} | {ok, Pid, State}
stop(State)
当要通过启动顶层督程来创建监督树的时候,会调用 start 。它要返回顶层督程的pid和一个选项值 State ,默认为 []。这个值会原样传递给 stop 。

StartType 通常是原子 normal 。只有在接管或故障转移中才会有其他值,参见 分布式应用 。 StartArgs 由 应用资源文件 中的键 mod 来定义。

在应用被停止之后会调用 stop/1 来进行必须的清除工作。注意应用实际的停止过程,也就是监督树的关闭,是按照 启动和停止应用 中所描述的方式自动处理的。

以下是一个例子,将来自 督程 一章中的督程打包为一个应用回调模块:

-module(ch_app).
-behaviour(application).

-export([start/2, stop/1]).

start(_Type, _Args) ->
    ch_sup:start_link().

stop(_State) ->
    ok.
一个库应用——不能被启动或者停止——则无须任何应用回调模块。

应用资源文件¶
我们通过创建一个放在应用资源文件——简称 .app 文件——中的应用规格来定义一个应用:

{application, Application, [Opt1,...,OptN]}.
Application 是一个代表应用的名称的原子。文件必须被命名成 Application.app 。

每一个 Opt 都是一个定义了应用某种特性的元组 {Key, Value} 。所有的键都是可选。忽略的键会使用默认的值。

例如,用于库应用 libapp 的最小化的 .app 文件的内容为:

{application, libapp, []}.
对于像 ch_app 这样的监督树应用的最小化 .app 文件的内容为:

{application, ch_app,
[{mod, {ch_app,[]}}]}.
键 mod 定义了回调模块以及应用的启动参数,在这个例子中相应是 ch_app 和 []。这表示应用启动的时候会调用:

ch_app:start(normal, [])
而当应用被停止的时候会调用:

ch_app:stop([])
当使用 systools 时,Erlang/OTP工具的打包代码(参见 发布 ),键 description、vsn、modules、registered 和 applications 则应该指定为:

{application, ch_app,
[{description, "Channel allocator"},
  {vsn, "1"},
  {modules, [ch_app, ch_sup, ch3]},
  {registered, [ch3]},
  {applications, [kernel, stdlib, sasl]},
  {mod, {ch_app,[]}}
]}.
description
简短描述,字符串。默认为 “”。
vsn
版本号,字符串。默认为”“。
modules
由该应用引入的所有模块。当生成启动脚本和tar文件时, systools 将用到这个列表。一个模块必须被定义于且仅于一个应用。默认为[]。
registered
应用中所有注册进程的名称。 systools 使用这个列表来探测在应用之间是否有名称冲突。默认为 []。
applications
所有在此应用之前必须启动的应用。 systools 使用该列表来生成正确的启动脚本。默认为 [],但是注意任何应用都要至少依赖于 kernel 和 stdlib 。
应用资源文件的语法和内容在 app(4) 中有详细的描述。

目录结构¶
当使用 systools 对代码进行打包的时候,每个应用的代码都放在单独的目录中 lib/Application-Vsn ,其中 Vsn 是版本号。

即便没有用到 systools ,最好也要了解它,因为Erlang/OTP其自身是按照OTP原则进行打包的所以才有了这个目录结构。如果存在一个应用的多个版本,那么代码服务器(见 code(3) )会自动使用来自目录中版本号最高的代码。

应用目录结构当然也可以用于开发环境。版本号是可以忽略的。

应用目录有以下子目录:

•src
•ebin
•priv
•include
src
包含Erlang源代码
ebin
包含Erlang目标代码—— beam 文件。 .app 文件也放在这里。
priv
用于应用专属文件。例如,C执行程序就放在这里。应该使用函数 code:priv_dir/1 来访问这个目录。
include
用于包含文件。
应用控制器¶
当启动了Erlang运行时系统,作为Kernel应用的一些进程会被启动。其中一个进程是应用控制器进程,注册为 application_controller 。

所有对应用的操作都由应用控制器来协调。它通过模块 application 里的函数来暴露接口, 请参考 application(3) 。尤其要了解,应用可以被加载、卸载、启动和停止。

加载和卸载应用¶
在能启动一个应用之前,首先它必须被加载。应用控制器会读取在 .app 中的信息并存起来。

1> application:load(ch_app).
ok
2> application:loaded_applications().
[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
{stdlib,"ERTS  CXC 138 10","1.11.4.3"},
{ch_app,"Channel allocator","1"}]被停止的或者从未启动过的应用,可以被卸载。该应用相关的信息会从应用控制器的内部数据库中删除。

3> application:unload(ch_app).
ok
4> application:loaded_applications().
[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
{stdlib,"ERTS  CXC 138 10","1.11.4.3"}]Note:
加载/卸载应用并不会加载/卸载该应用所使用的代码。代码加载是按照一般的方式进行的。

启动和停止应用¶
启动应用要调用:

5> application:start(ch_app).
ok
6> application:which_applications().
[{kernel,"ERTS  CXC 138 10","2.8.1.3"},
{stdlib,"ERTS  CXC 138 10","1.11.4.3"},
{ch_app,"Channel allocator","1"}]如果应用尚未被加载,那么应用控制器会首先使用 application:load/1 加载它。它会检查 applications 键对应的值,来确保要在该应用运行之前启动的应用都启动了。

然后应用控制器为应用创建一个应用主程序。它是该应用中所有进程的队长。应用主程序通过调用应用模块中的回调函数 start/2 启动应用(会给出由在 .app 文件中的 mod 建定义的启动参数)。

停止一个应用,但不卸载,可调用:

7> application:stop(ch_app).
ok
配置应用¶
可以使用配置参数来对应用进行配置。它们在 .app 文件中是一个由键 env 指定的 {Par, Val} 元组列表。

{application, ch_app,
[{description, "Channel allocator"},
  {vsn, "1"},
  {modules, [ch_app, ch_sup, ch3]},
  {registered, [ch3]},
  {applications, [kernel, stdlib, sasl]},
  {mod, {ch_app,[]}},
  {env, [{file, "/usr/local/log"}]}
]}.
Par 必须是一个原子, Val 可以是任意值。应用可以通过调用 application:get_env(App, Par) 或一些其他类似函数来获取配置参数的值,参见 application(3) 。

例如:

% erl
Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]

Eshell V5.2.3.6  (abort with ^G)
1> application:start(ch_app).
ok
2> application:get_env(ch_app, file).
{ok,"/usr/local/log"}.app 文件中的值可以被系统配置文件中的值所覆盖。系统配置文件是一个包含相关应用的配置参数的文件。

[{Application1, [{Par11,Val11},...]},
...,
{ApplicationN, [{ParN1,ValN1},...]}].
系统配置要被命名为 Name.config 并且要使用命令行参数 -config Name 来启动Erlang。更多信息参见 config(4) 。

例如:创建一个文件 test.config 包含一下内容:

[{ch_app, [{file, "testlog"}]}].
file 的值将覆盖在 .app 文件中所定义的 file 的值:

% erl -config test
Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]

Eshell V5.2.3.6  (abort with ^G)
1> application:start(ch_app).
ok
2> application:get_env(ch_app, file).
{ok,"testlog"}如果使用了 发布处理 ,那么只能使用一个系统配置文件同时该文件必须叫做 sys.config 。

在 .app 文件中的值,也包括系统配置文件中的值,都可以直接在命令行中被覆盖:

% erl -ApplName Par1 Val1 ... ParN ValN例如:

% erl -ch_app file '"testlog"'
Erlang (BEAM) emulator version 5.2.3.6 [hipe] [threads:0]

Eshell V5.2.3.6  (abort with ^G)
1> application:start(ch_app).
ok
2> application:get_env(ch_app, file).
{ok,"testlog"}应用启动类型¶
当启动应用的时候要定义一个启动类型。

application:start(Application, Type)
application:start(Application) 和调用 application:start(Application, temporary) 是一样的。类型还可以是 permanent 持久的或者 transient 过渡的:

•如果一个持久应用终止了,所有其他的应用以及运行时系统都会被终止。
•如果一个过渡应用以 normal 理由终止了,那么这个信息会被上报但是不会终止其他应用。如果一个过渡应用异常终止了——即以非 normal 的理由终止了——那么其他应用以及运行时环境也会被终止。
•如果一个临时(temporary)应用终止了,那么会报告该信息但不会终止其他应用。
我们总是可以通过明确调用 application:stop/1 来停止一个应用。无论是什么模式,都不会影响其他应用。

注意在实践中很少使用过渡模式,因为当一个监督树终止了,退出理由会被设置为 shutdown ,而非 normal 。


http://erlang.shiningray.cn/otp-design-principles/applications.html
分享到:
评论

相关推荐

    logger:Erlang日志系统 Erlang Logger

    Erlang日志系统启动日志应用:logger_app:start()可动态控制日志等级:loglevel:set(Level)获取当前日志等级:loglevel:get/0每次调用后都会重新编译logger,加载module添加了buffer缓存,每500ms或连续收到100条日志后...

    intellij-erlang:Erlang IDE

    增强的.app文件支持:参考分辨率和自动完成 Erlang 18兼容性:可选的回调支持( ),eunit兼容性( ) 增强的-behavior属性支持:自动完成,冲突检查( ) 拼写检查 非法图案/防护罩检查( , ) 代码编辑/缩进/...

    erlang-bblm:BBEdit 的 Erlang 语言模块

    它识别以下 Erlang 文件: erlang 源代码 (.erl) erlang 包含文件 (.hrl) escript 脚本 (.escript) 应用程序文件 (.app) 应用程序升级文件 (.appup)。 请为 BBEdit 9 和 BBEdit 10 使用 Erlang 语言模块 v1.2。通过...

    mslog:一个简单易用的erlang日志应用

    一个简单易用的erlang app 如何使用 添加到您的项目 将 mslog 添加到 rebar.config 或直接克隆它 {deps, [{mslog, ".*", {git, "git://github.com/qingliangcn/mslog.git", master}}]}. 或者 git clone git://...

    erlzk:一个纯Erlang ZooKeeper客户端(不依赖C)

    这应该生成.beam,.app文件。 要运行测试,请运行make test 。 要生成文档,请运行make doc 。 或将其添加到您的钢筋配置中 { deps , [ .... { erlzk , " .* " , { git , " git://github.

    erlang-port-howto:如何创建一个Erlang端口

    erlang-port-howto 如何创建一个Erlang端口。 端口是允许Erlang程序与外部程序进行交互的方法之一。 在本教程中,示例中使用了一个小的python... 教程文件位于lib/echo_app_1.0/doc ,渲染HTML可以在以下位置找到: 。

    syntaxerl:Erlang的语法检查器

    语法检查器当前支持erlang源文件(.erl),erlang头文件(.hrl),erlang配置(.config,.rel,.script,.app,.app.src),escript文件(.erl,.escript) ,.es),leex文件(.xrl)和yecc文件(.yrl)。...

    GCM_CCS:用 Erlang 编写的 GCM(Google Cloud Messageing)CCS(云连接服务器),支持上游和下游消息传递

    这可以在上找到您的 google Cloud Messaging 信用需要在文件 /src/gcm_ccs.app.src 中配置。将您的 GCM 凭据设置为定义的环境变量。 要运行应用程序调用application:start(gcm_ccs). . ##Upstream Messaging 您可以...

    cuttlefish:永远不要失去您孩子般的好奇感,墨鱼宝宝,对吗?

    Cuttlefish是Erlang应用程序的库,希望在Erlang app.config和类似sysctl的语法之间走得更好。 这个名字是“ sysctl”发音的双关语,笑话也能更好地解释。 Riak免责声明 尽管此自述文件和测试套件具有大量的Riak知识...

    taran:Erlang Tarantool驱动程序

    并将taran添加到your_project.app.src文件。 对于tarantool 1.6调用函数支持,请从taran / rebar.conf中删除{d,'TARANTOOL_V17_CALL'} 用法{ ok , Db } = taran : connect ( _ConnName = test ).{ ok , test }%

    feck:Erlang的亵渎过滤器库

    将feck添加到您的.app或.app.src文件中: { applications , [ feck ] } 用法 所有feck函数都希望通过配置: Config = feck : configure ( [ { blacklist , [ " very " , " bad " , " words " ] } ] ) feck : ...

    enot:Erlang高级项目经理

    埃诺特 Erlang高级项目经理。 为什么是埃诺特? 强大的依赖管理 -> 构建稳定性 在本地和远程构建 deps 缓存 -> 提高构建速度 json 项目配置 -> devOps 和第三方... src/project_name.app.src - 应用程序 src 文件 sr

    slacker:Erlang Slack REST API包装器

    这将构建.beam,.app文件和文档。 要生成文档,请运行make doc 。 或将其添加到您的rebar.config {deps, [ .... {slacker, {git, "git://github.com/julienXX/slacker.git", {branch, "master"}}}]}.请注意,依赖项...

    apns4erl:适用于Erlang的Apple Push Notification Server

    Apns4erl v2 此库旨在允许您在Erlang中通过HTTP2编写的APNs提供程序。 版权所有(c)2017 Erlang Solutions Ltd. ,根据Apache 2许可发布 您可以在找到v1吗? 注意: Apns4erl v2仍在开发中。... [ { app

    rebar_grizzly:Erlang热代码重载rebar插件

    钢筋灰熊插件 用于 erlang 热代码升级的 Rebar 插件。 将远程节点上的 Beam 文件与应用程序的ebin目录同步(重新加载和保存)。 Grizzly 只对 rpc 使用长名称。安装要安装 grizzly,您需要将其添加为 rebar 配置的...

    active:ACTIVE活跃

    活动:连续编译 Active是一种替换,它使用本机文件系统OS异步侦听器来编译和重新加载Erlang文件,DTL模板和其他文件。 它在监督下充当FS订户,并使用 , IEx.Helpers.c或您可以添加自己的编译器,如rebar3或make 。...

    er_zauker:基于Erlang的Google代码搜索克隆

    er_zauker_app : erlist ( " trigram " ). 从erlang命令行。 您将获得一个可能包含关键字的文件列表。 如果没有出现错误,则准备好进行真正的搜索 如何进行搜寻 在bin目录中,您将找到czgrep。 使用czgrep搜索刚刚...

    Quokka:用于Erlang节点和群集的本机GUI可视化工具,接受用RustDear ImGUI(OpenGL)编写的来自跟踪文件和活动节点的数据流

    这是一个本机GUI应用程序,它从文件中获取跟踪数据流,或者从活动的Erlang(BEAM VM)节点或群集中获取事件流,并尝试重建“真实性”的实际图片并将其显示在某种程度上有用办法。 想法是提供搜索,分组和自省工具...

    keyua_wsgi_app

    sudo apt-get install -y erlang sudo apt-get install rabbitmq-server 然后启动并测试它: systemctl enable rabbitmq-server systemctl start rabbitmq-server systemctl status rabbitmq-server 对于...

    etracker:Erlang Bit-Torrent HTTP 和 UDP 跟踪器

    配置查看 src/etracker.app.src穆宁插件插件和示例配置在 munin 目录中。 插件编译通过 SBCL 1.1.* 测试HTTP 请求宣布 server-http-address/announce?...刮 server-...

Global site tag (gtag.js) - Google Analytics