rebar是一个遵循Erlang/OTP原则的Erlang项目构建工具,使用它能够减小构建标准Erlang/OTP项目架构配置的工做量,而且能够很容易的编译,测试,发布Erlang应用程序。更强大的是,rebar提供了一种依赖管理机制,它可使开发者很方便的经过Git,Hg等方式重用常见的第三方Erlang模块或库。html
安装node
你能够从https://github.com/rebar/rebar/wiki/rebar 下载并编译好的版本,也能够本身下载rebar的源代码,本身编译一个:git
git clone git://github.com/rebar/rebar.git cd rebar ./bootstrap
上面编译好以后,在当前目录下就会生成一个名为 "rebar" 独立的 erlang 脚本(escript),把它放在你想建立标准 Erlang/OTP 项目的目录路径下便可使用。github
在终端输入 "rebar -c" 将列出全部可执行的 rebar 命令。或者输入 "rebar -h" 查看更多的 rebar 参数信息。shell
用rebar 建立项目bootstrap
建立一个名为rebarapp的文件夹架构
mkdir rebarapp cd rebarapp
建立名为rebarapp项目:app
./rebar create-app appid=rebarapp
rebar 会根据默认模板(template)在当前目录下生成一个 src 文件夹,里面包含下面3个文件:框架
rebarapp.app.src 应用的资源描述文件,影响后面编译生成的 rebarapp.app 里的内容函数
rebarapp_app.erl 应用的 Application Behaviour 代码文件
rebarapp_sup.erl 应用的 Supervisor Behaviour 代码文件
rabar还内置了gen_server,gen_fsm,application等 Erlang/OTP 行为模式的模板,能够自动生成这些行为模式的框架代码。这里以 gen_server 为例,给应用添加一个名为 rebarapp_server 的 gen_server 行为模式。在应用根目录执行如下命令
./rebar create template=simplesrv srvid=rebarapp_server
执行完后自动会在 src 文件夹里生成一个 rebarapp_server.erl 的 gen_server 框架格式的文件,simplesrv 是 gen_server 模板的名称(gen_fsm、application对应的是simplefsm、simpleapp),srvid 则是该 gen_server 模板的ID(gen_fsm、application对应的是fsmid、appid)。
为了测试,这里对 rebarapp_server.erl 进行修改,export 一个 hello 方法,并添加一个 cast 的消息输出,修改后的 rebarapp_server.erl 文件内容以下:
-module(rebarapp_server). -behaviour(gen_server). -define(SERVER, ?MODULE). %% ------------------------------------------------------------------ %% API Function Exports %% ------------------------------------------------------------------ -export([start_link/0, hello/0]). %% ------------------------------------------------------------------ %% gen_server Function Exports %% ------------------------------------------------------------------ -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]). %% ------------------------------------------------------------------ %% API Function Definitions %% ------------------------------------------------------------------ start_link() -> gen_server:start_link({local, ?SERVER}, ?MODULE, [], []). %% @doc just a test hello() -> gen_server:cast(?SERVER, 'HELLO'). %% ------------------------------------------------------------------ %% gen_server Function Definitions %% ------------------------------------------------------------------ init(Args) -> {ok, Args}. handle_call(_Request, _From, State) -> {reply, ok, State}. handle_cast('HELLO', State) -> io:format("Hello World!~n"), {noreply, State}; handle_cast(_Msg, State) -> {noreply, State}. handle_info(_Info, State) -> {noreply, State}. terminate(_Reason, _State) -> ok. code_change(_OldVsn, State, _Extra) -> {ok, State}. %% ------------------------------------------------------------------ %% Internal Function Definitions %% ------------------------------------------------------------------
修改 rebarapp_sup.erl 的 init 函数,把 rebarapp_server 做为应用管理者 rebarapp_sup 的工做进程启动,修改以下:
init([]) -> RebarappServer = ?CHILD(rebarapp_server, worker), {ok, { {one_for_one, 5, 10}, [RebarappServer]} }.
编译应用
./rebar compile
编译完后,会在根目录下生成一个 ebin 的文件夹,里面存放的是该应用的资源文件 rebarapp.app 和应用的 beam 文件,也能够执行如下命令对编译生成的应用文件进行清理:
./rebar clean
使用 Edoc 生成应用文档
./rebar doc
命令执行完后,会在根目录生成一个 doc 的文件夹,打开里面的 index.html 就能够很直观地看到该应用的模块 API 概览。
发布应用
在应用根目录下建立一个名为 rel 的文件夹,用来做为应用发布的文件夹:
mkdir -p rel cd rel
在当前 rel 文件夹里建立一个名为 rebarapp 的独立的 Erlang VM 节点:
rebar create-node nodeid=rebarapp
修改 rel/reltool.config 里的 lib_dirs 的值,默认是一个空列表 "[]",改成应用所在的目录路径 '["../../"]',否则到后面编译发布时会报 "Missing application directory" 的错误出来,修改后的 reltool.config 配置内容以下所示:
返回应用的根目录,建立rebar.config文件,并在 rebar.config 加上如下一行,把新建的 rel 文件夹放入到 rebar 可访问的子文件夹里,做为应用内容发布文件夹:
{sub_dirs, ["rel"]}.
再从新编译下应用 rebarapp:
./rebar compile
若是没报什么错,应用 rebarapp 就能够发布了,在rel目录下:
../rebar generate
在终端上看到 "==> rel (generate)" 且没报什么错,应用 rebarapp 发布成功,并在 rel/rebarapp/bin 目录下生成一个用来启动应用或中止应用等操控动做的 shell 文件 rebarapp。
操控文件 rel/rebarapp/bin/rebarapp 用法:
rebarapp {start|start_boot |foreground|stop|restart|reboot|ping|console|console_clean|console_boot |attach|remote_console|upgrade}
启动应用 rebarapp
./rel/rebarapp/bin/rebarapp start
中止应用 rebarapp
rel/rebarapp/bin/rebarapp stop
或者启动应用 rebarapp 后返回一个 erlang shell 的控制台
rel/rebarapp/bin/rebarapp console
OK,在 erlang shell 的控制台上调用 rebarapp_server:hello() 输出一个 "Hello World!" 吧。
参考文章:
http://www.cnblogs.com/panfeng412/archive/2011/08/14/2137990.html
http://dhq.me/build-compile-eunit-release-erlang-application-with-rebar