reltool用户指南

目录1概述

1.1适用范围和目的

1.2了解更多内容

2使用

2.1GUI相关

2.1.1SystemWindow

2.1.2SystemSettings

3用命令生成relase(targetsystem)

3.1基本配置

3.2sys配置

3.3app配置

3.4mod配置

4例子

5configtype定义

reltool是Erlang提供的release管理工具.我们依据Erlang/OTP开发的application,最后需要发布,这时需要使用reltool帮我们生成最终的release,也称为targetsystem.同时reltool可以分析application的依赖关系,帮助我们正确的发布应用.reltool包括一个基于wx的GUI前端(wxWidgetserlangbind),其可以用来查看application的依赖关系,可以查看模块的依赖关系,可以查看源代码.reltool也提供使用命令来生成自定义的发布包.1.1适用范围和目的

本文档主要介绍如何使用reltool,reltool为Erlang/OTP开发环境的一部分.本文假设读者对Erlang相关开发比较熟悉,了解Eralng/OTP开发规范.Erlang/OTP要求R13B02及以上版本.1.2了解更多内容

可以通过下列相关文档了解更多Erlang/OTP开发相关信息reltool参考手册

reltooluserguide

Erlang/OTPSystemPrinciples

Erlang/OTPDesignPrinciples

图书ProgrammingErlang:SoftwareforaconcurrentWorld(2007)

前面讲过,reltool提供GUI和命令两种交互方式,本章首先简单的介绍GUI界面相关内容,重点是使用命令生成release,发布自己的应用.之所以重点介绍命令方式,主要基于两个因素:命令方式是基础,GUI只是提供了一个界面封装,本质还是调用的相关的命令

GUI目前功能还不是很完整,很多操作不支持

2.1.1SystemWindow

通过调用reltool:start/0,1启动reltool,reltool在启动时,首先扫描所有的application和module,分析其相互依赖关系.随后启动systemwindow.

systemwindow包含四个pagewindow(tabs):Libraries

Systemsettings

Applications

Releases

点击对应的tag,可以切换page.

systemwindow如下图:

Librarie窗口如下图

在library窗口,我们设置reltool将要使用的代码.本页面以tree的形式来组织内容,你可以点击每行前面的标记折叠/展开对应内容.

Librarydirectories,Escriptfiles都可以进行操作.选择对应的项目,按住鼠标右键显示对应的菜单,移动鼠标选择对应的菜单项,释放鼠标右键.

双击lib下某个application,可以显示对应的applicationwindow.

通过reltoolGUI,我们还可以查看很多windows,如aplication依赖图:

源代码窗口:

2.1.2SystemSettings

Avaiable中显示的所有可用的applications.在systempage中,我们可以设置全局的application包含规则,即incl_cond.

incl_cond包含三种策略,我们在介绍命令方式创建release时,会详细介绍.先说一下为自己的application生成release的步骤:依据Erlang/OTP项目完成,测试通过

定义reltool使用的关于最终release的各种配置参数Config

reltool:start_server(Config)启动reltool

reltool:get_target_spec/1获取根据Config产生的用来创建targetsystem的一系列"动作"(Spec)

reltool:eval_target_spec/3根据Spec生成targetsystem

书写辅助的脚本,用来生成最终的安装包(可以为tar包,或者zip等)

我们假设第1步,您已经完成.

生成targetsystem的重点就是config的设置了,让我们详细的描述一下reltool手册中各项config参数.

config可以大体分为4种类型:其中,很多配置信息在sys,application,mod三个等级中均会出现,其关系为:mod>app>sys,即mod配置覆盖app配置,app配置覆盖sys配置.3.1基本配置

root_dirReltool根据当前开发环境产生targetsystem,因此config信息中势必包含erlangroot_dir信息.root_dir指明erlang的当前安装目录(比如在ubuntu9.04下,默认为/usr/local/lib/erlang).本选项可以不用指定,reltool会自动设置root_dir.lib_dirs除却$ERL_LIB外,指定附加的library目录.主要用来指定非Erlang/OTP正式发布版本中的application或library.如第三方library,或我们自己的application.3.2sys配置

erts指定ertsapplication信息,具体的字段参考后面介绍的app配置.escriptescript脚本配置信息,包含escript文件,以及对应的配置信息apptargetsystem中包含的app信息.比如所有的release都要包含kernel,stdlib,具体的app的相关配置,轻参考后面介绍的applevel配置mod_cond设置module的包含策略.其包含多种方式:all-表示如果某个app被包含,那么其包含的所有模块全部被包含.假设app名为demoapp,all不仅包含demoapp/ebin下的所有模块,同时demoapp.app中modules字段描述的所有模块也将被包括(默认)

ebin-表示ebin目录下所有的模块,以及相关的模块会被包含

app-表示.app描述文件,以及相关的模块会被包含

derived-表示被其他包含的模块用到的相关模块会被包含

此处配置的mod_cond是syslevel的配置,控制所有的app中的module包含策略.当然我们可以对这个信息,在applevel进行覆盖.incl_cond设置applicaion以及escript的包含策略.其包含3种类型:derived-表示包含没有明确设置incl_cond,同时被其他application直接或间接引用的application.(默认)

include-表示包含所有没有明确设置incl_cond的application

exclude-表示排除排除没有明确设置incl_cond的application

include和exclude意义相反.一个是包含没有设置incl_cond的apps,一个是排除没有设置incl_cond的apps.一般我们使用默认的derived选项,这样保证所有相关的application均被包含,不会出现targetsystem中,某个模块没有定义的错误.我们可以通过前面reltoolGUI部分介绍的application依赖关系图来了解application的交互相关信息.boot_rel指定targetsystem中默认启动项(rel),一个targetsystem中可能包含很多的release(通过rel来指定)rel指定rel内容(Releasespecificconfiguration),每个rel定义会被映射成rel,script和boot文件,请参考Erlang/OTPDesignPrinciplesReleaserelocable指定targetsystem中erl执行时自动检测路径相关信息({relocable,true}),还是硬编码指定路径启动({relocable,false}).如果relocable为false,那么targetsystem必须首先通过reltool:install/2进行安装,如果relocable为true,targetsystem移动到其他目录时,仍然可以方便的运行.{relocable,true}(默认)profile指定taregetsystem的类型,此选项主要影响:incl_sys_filters,excl_sys_filters,incl_app_filters和excl_app_filters.不同的profile类型,以上4个filters不同.主要包含3种:development-开发测试模式(默认)

embedded-嵌入式完整模式

standalone-单独模式,不携带相关的可执行文件

在生成targetsystem时,实际上主要有两个步骤:首先创建一个完整的文件候选列表,它包含尽可能多的文件;随后调用各种相关的filter定义,对结果进行过滤,最后声称最终的targetsystem.

一般情况下,我们的targetsystem要是一个完整的可执行的系统,因此我们许要设置profile为embedded.(当然不设置profile,只是修改4个相关的filter,也可以达到我们想要的效果)app_file控制app的内容,因为有各种各样的filter,因此最终的targetsystem中包含的模块,可能与app文件定义的模块列表不一致,本选项控制app的内容.主要包含3种:keep-将app直接拷贝到targetsystem中(默认)

strip-依据app文件产生targetsystem中的app文件,并将未被包含的模块从app文件中移出

all-依据app文件产生taregesystem中的app文件,同时所有的模块将添加到app文件中,如果某个应用没有app文件,那么会自动创建一个app文件.

debug_info是否去除beam文件中的调试信息:keep表示保持;strip表示去除incl_sys_filters指定一个正则表达式列表,用来表示哪些系统文件可以出现在targetsystem中.如果某个系统文件想被包括,那么其必须满足incl_sys_filters中的某个正则表达式,同时不能满足excl_sys_filters中的任何表达式.

比如:{incl_sys_filters,["^bin","^erts","^lib","^releases"]},

表示$ERL_ROOT目录下的bin,erts,lib,releases目录均要包含.

incl_app_filters,excl_app_filters同sys相关的filters含义大致相同,只是用来控制application的包含规则.excl_sys_filters指定一个正则表达式列表,表示哪些系统文件不可以出现在targetsystem中.默认为[].incl_app_filters指定一个正则表达式列表,表示application中的哪些文件可以被包含.如果某个文件想被包含,至少要满足正则表达式列表中的一个表达式.默认为[".*"],如果设置为[],那么application中的任何文件都不会被包含.excl_app_filters指定一个正则表达式列表,表示application的哪些文件不可以出现在targetsystem中.默认为[].incl_archive_filters指定application中哪些一级子目录包含在压缩包中(与包含正常的目录对应),通过一个正则表达式列表指定要包含在压缩包中的一级子目录.默认为[".*"]excl_archive_filters指定一个正则表达式列表,指定application的哪些一级目录不包含在压缩包中.如果某个目录,匹配任何一个正则表达式,则不会包含在压缩包中.默认为["^include$","^priv$"]archive_opts创建压缩包对应的参数,在zip:create/3中使用,请参考zipmodule,默认为[].3.3app配置

vsn指定要包含的application的版本,因为在系统中,可能存在同一应用的多个版本.如果忽略,则使用最新版本.mod模块相关的配置信息.必须包含一个模块名称,以及其他可选的模块配置(参照后面mod配置)mod_cond-同syslevel的同名配置含义相同incl_cond-同上debug_info-同上incl_app_filters-同上excl_app_filters-同上incl_archive_filters-同上excl_archive_filters-同上archive_opts-同上3.4mod配置

incl_cond指示模块是否被包含,其覆盖application及system配置中的incl_cond信息.

其包含3个值:include-表示本模块将被包含

exclude-表示本模块不被包含

derived-表示如果其他被包含的模块引用本模块,则本模块被也被包含.

debug_info同app配置中debug_info描述.4例子

最后是一个实例,我们为erlips(erlangipservice)生成targetsystem.config(erlips.config)如下:{sys,[{lib_dirs,["/home/litaocheng/erlang"]},{boot_rel,"erlips"},{rel,"erlips","0.1",[kernel,stdlib,sasl,mochiweb,erlips]},{relocatable,true},{profile,embedded},{app_file,keep},{debug_info,strip},{mod_cond,all},{incl_cond,derived},{incl_app_filters,["^include","^priv","^ebin","^src"]},{excl_app_filters,[]},{incl_archive_filters,[]},{excl_archive_filters,[".*"]},{app,kernel,[{incl_cond,include}]},{app,stdlib,[{incl_cond,include}]},{app,sasl,[{incl_cond,include}]},{app,erlips,[{incl_cond,include},{incl_app_filters,[".*"]},{excl_app_filters,["^log","^var","^release"]}]},{app,mochiweb,[{incl_cond,include}]},{app,runtime_tools,[{incl_cond,include}]}]}.

我们为一个名叫erlips的application生成targetsystem.

随后执行:>{ok,Server}=reltool:start_server([{config,"erlips.config"}]).>{ok,Spec}=reltool:get_target_spec(Server).>RelDir="target_dir".>file:make_dir(RelDir).>ok=reltool:eval_target_spec(Spec,code:root_dir(),RelDir).>zip:zip(RelDir++".zip",[RelDir]).%创建zip包

将生成的zip包拷贝到没有安装Erlang环境的电脑中,解压zip包,随后运行:./bin/erl

则自动启动erlips应用.5configtype定义

下面为reltool中各相关config的type定义(参考reltool):options()=[option()]option()={config,config()|file()}|{trap_exit,bool()}|{wx_debug,term()}config()={sys,[sys()]}sys()={root_dir,root_dir()}|{lib_dirs,[lib_dir()]}|{profile,profile()}|{erts,app()}|{escript,escript_file(),[escript()]}|{app,app_name(),[app()]}|{mod_cond,mod_cond()}|{incl_cond,incl_cond()}|{boot_rel,boot_rel()}|{rel,rel_name(),rel_vsn(),[rel_app()]}|{relocatable,relocatable()}|{app_file,app_file()}|{debug_info,debug_info()}|{incl_sys_filters,incl_sys_filters()}|{excl_sys_filters,excl_sys_filters()}|{incl_app_filters,incl_app_filters()}|{excl_app_filters,excl_app_filters()}|{incl_archive_filters,incl_archive_filters()}|{excl_archive_filters,excl_archive_filters()}|{archive_opts,[archive_opt()]}app()={vsn,app_vsn()}|{mod,mod_name(),mod()}|{mod_cond,mod_cond()}|{incl_cond,incl_cond()}|{debug_info,debug_info()}|{app_file,app_file()}|{incl_sys_filters,incl_sys_filters()}|{excl_sys_filters,excl_sys_filters()}|{incl_app_filters,incl_app_filters()}|{excl_app_filters,excl_app_filters()}|{incl_archive_filters,incl_archive_filters()}|{excl_archive_filters,excl_archive_filters()}|{archive_opts,[archive_opt()]}mod()={vsn,app_vsn()}|{incl_cond,incl_cond()}|{debug_info,debug_info()}rel_app()=app_name()|{app_name(),app_type()}|{app_name(),[incl_app()]}|{app_name(),app_type(),[incl_app()]}app_name()=atom()app_type()=permanent|transient|temporary|load|noneapp_vsn()=string()archive_opt=zip_create_opt()boot_rel()=rel_name()app_file()=keep|strip|alldebug_info()=keep|stripdir()=string()escript()={incl_cond,incl_cond()}escript_file()=file()excl_app_filters()=regexps()excl_archive_filters()=regexps()excl_sys_filters()=regexps()file()=string()incl_app()=app_name()incl_app_filters()=regexps()incl_archive_filters()=regexps()incl_cond()=include|exclude|derivedincl_sys_filters()=regexps()lib_dir()=dir()mod_cond()=all|app|ebin|derived|nonemod_name()=atom()profile()=development|embedded|standalonere_regexp()=string()reason()=string()regexps()=[re_regexp()]|{add,[re_regexp()]}|{del,[re_regexp()]}rel_file()=term()rel_name()=string()rel_vsn()=string()relocatable=boolean()root_dir()=dir()script_file()=term()server()=server_pid()|options()server_pid()=pid()target_dir()=file()

相关推荐