我们写完一组功能模块后(在erlang中,以module为单位),总是希望这一组模块,可以打包成一个应用,作为一个单独的整个,可以启动,停止,象 mnesia一样。并可以在其它应用中引用。如何来做到这一点呢。每一个应用都是通过application:start系列函数来启 动,application:stop可以停止一个应用。
一个应用需要一个.app文件来描述,主要描述它包括哪些文件,参数等。
如 果在启动erlang的VM时就启动一个应用呢,实际上,我们是没有办法通过VM的参数来直接启动一个自定义应用,有些参数如:start_sasl可以 启动一些内部的标准的build-in应用,但是我们可以给VM一个执行入口,这就象C语言或是java语言的main函数一样,VM启动时,执行这个程 序的入口点,这样就可以在这个入口中执行启动应用的操作。
这个入口点通过参数-s 来指定。下面我们来看一个例子:
1. erl -s erlycomet_demo
这个参数指定,VM启动后,调用erlycomet_demo:start()无参函数
2. 在erlycomet_demo:start()函数中,我们写如下代码:
application:start(erlycomet_demo).
上面这句话,启动一个erlycomet_demo的应用,这里,VM就会在搜索目录中找到erlycomet_demo.app这个文件,如果不到,报 错,如果找到,则按这个文件中的指示,启动erlycomet_demo应用。这一部分可以参看相关的文档,简单的,在erlycomet_demo中一 搬有一个参数{mod,{mod_name_app,[]}}
这个参数指示,调用mod_name_app:start(_type,Argu)这个函数。以erlycomet_demo为例,这个调用进入到erlycomet_demo_app:start(_type,Argu)中,
3. 在erlycomet_demo_app的start(_type,Argu)中,启动 一个supervisor进程,进而启动子进程。如下所示:
erlycomet_demo_sup:start_link(Args).
了 解了,我们是通过application为单位来打包应用的,那么我们如何才能共用应用呢??比如,我们如何在应用A中使用应用2的功能呢??答应是:以 应用为单位来进行引用,例如:我们要便用mnesia功能,我就就调用mnesia:start()或是在应用A的application中指定,要启动 mnesia。 在OPT中,有很多应用都是相互独立,而又相互引用的。比如:mnesia, crpyto,inet 等。
erlang的程序打包
最新推荐文章于 2019-12-11 21:21:23 发布