文档章节

用rebar来构建,编译,测试,发布Erlang应用程序

nao
 nao
发布于 2015/06/10 09:33
字数 1179
阅读 164
收藏 1
点赞 1
评论 0

    rebar是一个遵循Erlang/OTP原则的Erlang项目构建工具,使用它可以减少构建标准Erlang/OTP项目架构配置的工作量,并且可以很容易的编译,测试,发布Erlang应用程序。更强大的是,rebar提供了一种依赖管理机制,它可以使开发者很方便的通过Git,Hg等方式重用常见的第三方Erlang模块或库。

安装

    你可以从https://github.com/rebar/rebar/wiki/rebar 下载并编译好的版本,也可以自己下载rebar的源代码,自己编译一个:

git clone git://github.com/rebar/rebar.git
cd rebar
./bootstrap

    上面编译好之后,在当前目录下就会生成一个名为 "rebar" 独立的 erlang 脚本(escript),把它放在你想创建标准 Erlang/OTP 项目的目录路径下即可使用。

    在终端输入 "rebar -c" 将列出所有可执行的 rebar 命令。或者输入 "rebar -h" 查看更多的 rebar 参数信息。

 用rebar 创建项目

    创建一个名为rebarapp的文件夹

mkdir rebarapp
cd rebarapp

    创建名为rebarapp项目:

./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

本文转载自:http://dhq.me/build-compile-eunit-release-erlang-application-with-rebar

共有 人打赏支持
nao

nao

粉丝 28
博文 151
码字总数 107499
作品 0
徐汇
用 rebar 来构建、编译、测试、发布 Erlang 应用程序

rebar 是一个遵循 Erlang/OTP 原则的 Erlang 项目构建工具,使用它可以减少构建标准 Erlang/OTP 项目架构配置的工作量,并且可以很容易的编译、测试、发布 Erlang 应用程序。更强大的是,reb...

千山万水
2015/10/15
1K
0
rabbitMQ 初探-环境搭建、erlang客户端例子教程

rabbitMQ 初探-环境搭建、erlang客户端例子教程 1. rabbitMQ简介 rabbitmq起源于Advanced Message Queuing Protocol(AMQP,高级消息队列协议,参见 [AMQP-wiki]),AMQP从一开始就设计成为开放标...

问天小凯
2017/10/27
0
0
rebar3发布,归属权更新到erlang团队了

rebar3的beta 4发布很久了,一直奇怪为啥没有发布3.0稳定版。今天一看,不但发布了3.0 stable版本,而且github的地址也改了,由github.com/rebar/rebar3 改为 github.com/erlang/rebar3 了,...

格通
2016/03/15
52
0
leeyi/es_client

es_client An OTP application wget https://s3.amazonaws.com/rebar3/rebar3 && chmod +x rebar3 Build $ rebar3 compile Build and Run (In Erlang/OTP 20) Erlang/OTP 20 [erts-9.0] [sou......

leeyi
2017/09/13
0
0
Elixir v1.2.0 正式发布,函数式编程语言

Elixir v1.2.0 正式发布,此版本新增 Erlang 18 和 Rebar 3 支持,还有一些语言特性改进: The addition of multi aliases/imports/require: Support for variables in map keys: Support fo......

oschina
2016/01/02
1K
2
erlang 应用程序启动遇到的问题。

rebar构建的应用程序,按控制台的方式能启动,但是通过rebar生成的release中的 脚本 启动就会出现如下错误。

Nidhogg
2015/06/24
177
3
rebar.config的依赖包名称问题

问题出在rebar,rebar3没测试。 今天用rebar管理项目,在添加一个类库时遇到问题,类库地址为: https://github.com/tonyg/erlang-rfc4627 rebar.config里面这么写: {deps, [{erlang-rfc462...

格通
2016/02/24
225
0
收藏的博客 -- erlang学习

一、技术博客 http://blog.csdn.net/erlib 为什么我要选择erlang+go进行服务器架构(1) 为什么我要选择erlang+go进行服务器架构(2) http://www.qingliangcn.org/ https://github.com/qinglian...

libaineu2004
2017/09/14
0
0
Erlang 语言的作者教你如何入手

本文是从[erlang-questions] Ways to get started 这篇文章翻译而来。 我是个守旧派 — 你不需要任何强大的开发工具。只需要一个文本编辑器和一个erlang shell。 打开你的文本编辑器: 输入下...

红薯
2011/07/21
2.3K
13
【读书笔记】"Erlang In Anger" Erlang应用的错误调试

全书 封面不明觉厉 这本书很薄,只有93页,而且是免费的,有兴趣的朋友可以去看一看。虽然书中没有提到Elixir,但对于学习Elixir也很有帮助。这本书适合对Erlang和OTP有初步了解的人阅读。书...

ljzn
2016/09/26
29
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

实现异步有哪些方法

有哪些方法可以实现异步呢? 方式一:java 线程池 示例: @Test public final void test_ThreadPool() throws InterruptedException { ScheduledThreadPoolExecutor scheduledThre......

黄威
今天
0
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

六库科技
今天
0
0
牛客网刷题

1. 二维数组中的查找(难度:易) 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入...

大不了敲一辈子代码
今天
0
0
linux系统的任务计划、服务管理

linux任务计划cron 在linux下,有时候要在我们不在的时候执行一项命令,或启动一个脚本,可以使用任务计划cron功能。 任务计划要用crontab命令完成 选项: -u 指定某个用户,不加-u表示当前用...

黄昏残影
昨天
0
0
设计模式:单例模式

单例模式的定义是确保某个类在任何情况下都只有一个实例,并且需要提供一个全局的访问点供调用者访问该实例的一种模式。 实现以上模式基于以下必须遵守的两点: 1.构造方法私有化 2.提供一个...

人觉非常君
昨天
0
0
《Linux Perf Master》Edition 0.4 发布

在线阅读:https://riboseyim.gitbook.io/perf 在线阅读:https://www.gitbook.com/book/riboseyim/linux-perf-master/details 百度网盘【pdf、mobi、ePub】:https://pan.baidu.com/s/1C20T......

RiboseYim
昨天
1
0
conda 换源

https://mirrors.tuna.tsinghua.edu.cn/help/anaconda/ conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/conda config --add channels https://mir......

阿豪boy
昨天
1
0
Confluence 6 安装补丁类文件

Atlassian 支持或者 Atlassian 缺陷修复小组可能针对有一些关键问题会提供补丁来解决这些问题,但是这些问题还没有放到下一个更新版本中。这些问题将会使用 Class 类文件同时在官方 Jira bug...

honeymose
昨天
0
0
非常实用的IDEA插件之总结

1、Alibaba Java Coding Guidelines 经过247天的持续研发,阿里巴巴于10月14日在杭州云栖大会上,正式发布众所期待的《阿里巴巴Java开发规约》扫描插件!该插件由阿里巴巴P3C项目组研发。P3C...

Gibbons
昨天
1
0
Tomcat介绍,安装jdk,安装tomcat,配置Tomcat监听80端口

Tomcat介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 java程序写的网站用tomcat+jdk来运行...

TaoXu
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部