用Rebar3构建你的第一个Erlang应用

Rebar3是Erlang的构建工具和包管理工具。归功于Rebar3以及它的插件Hex,创建和发布你的Erlang包非常简单。让我们做一个简单的“hello world”式的包来演练一下。

下载Rebar3

从Rebar3官方网站下载最新版本的Rebar3,网址:http://www.rebar3.org/

1
curl -O https://s3.amazonaws.com/rebar3/rebar3

用chmod赋予其可执行权限,并将它加入你的环境变量PATH。

1
2
chmod +x rebar3
export PATH=$PATH:rebar3所在目录

你的第一个Erlang应用

使用rebar3 new命令采用内建模块app可以创建一个新的项目。在本例子里我们创建一个叫做myapp的项目。其他可用内建模版是:release、lib、plugin、escript、cmake。

1
2
3
4
5
6
7
8
$ rebar3 new app myapp
===> Writing myapp/src/myapp_app.erl
===> Writing myapp/src/myapp_sup.erl
===> Writing myapp/src/myapp.app.src
===> Writing myapp/rebar.config
===> Writing myapp/.gitignore
===> Writing myapp/LICENSE
===> Writing myapp/README.md

代码在src目录里。

1
2
3
4
5
6
7
8
9
10
$ cd myapp
$ tree
.
├── LICENSE
├── README.md
├── rebar.config
└── src
├── myapp.app.src
├── myapp_app.erl
└── myapp_sup.erl

因为Rebar3只处理 OTP结构的项目 ,所以约定成俗用一个 .app.src 文件定义你的应用是一个OTP应用。看起来是不是很熟悉?这个文件也是Erlang文件。你可以阅读 详细的指引 来看看它都能包括些什么元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ cat src/myapp.app.src
{application, 'myapp',
[{description, "An OTP application"},
{vsn, "0.1.0"},
{registered, []},
{mod, {'myapp_app', []}},
{applications,
[kernel,
stdlib
]},
{env,[]},
{modules, []}
]}.

src/myapp_app.erl是一个非常简单的代码框架。它只是让你可以启动和停止你的Erlang应用。

1
2
3
4
5
6
7
8
$ cat src/myapp_app.erl
-module('myapp_app').
-behaviour(application).
-export([start/2, stop/1]).
start(_StartType, _StartArgs) ->
'myapp_sup':start_link().
stop(_State) ->
ok.

Rebar3用rebar.config来指定一些额外的元数据,比如依赖。rebar.config还可以包含很多配置项。你可以参考 详细例子 来学习各种配置。

1
2
3
$ cat rebar.config
{erl_opts, [debug_info]}.
{deps, []}.

现在我们用Rebar3启动一个Erlang shell,它包含了你的应用及依赖的路径。然后运行 application:start(myapp). 来确认你的应用被正确地装载了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ rebar3 shell
===> Verifying dependencies...
===> Compiling myapp
Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.10.4 (abort with ^G)
1> application:start(myapp).
ok
2> application:stop(myapp).
ok
3>
=INFO REPORT==== 29-Jun-2015::16:14:10 ===
application: myapp
exited: stopped
type: temporary

Fred HebertLearn You Some Erlang 的作者)写了一篇很好的文章介绍rebar3 shell的命令。

Erlang的包

准备工作

我们需要安装一个叫做rebar3_hex的插件来从Hex.pm(Erlang和Elixir的包管理者)获取和安装Erlang包。简单地把如下一行加入到rebar.config文件中(你需要Erlang/OTP17.4或以上版本)。

1
{plugins, [rebar3_hex]}.

然后运行命令:rebar3 update 来启用这个插件。

1
2
3
4
5
6
7
8
9
$ rebar3 update
===> Fetching jsx ({pkg,<<"jsx">>,<<"2.6.1">>})
===> Fetching ssl_verify_hostname ({pkg,<<"ssl_verify_hostname">>,
<<"1.0.5">>})
===> Fetching rebar3_hex ({pkg,<<"rebar3_hex">>,<<"0.6.0">>})
===> Compiling ssl_verify_hostname
===> Compiling jsx
===> Compiling rebar3_hex
===> Updating package index…

如果你想避免每次创建一个新Erlang应用都要做这个步骤,则将上述配置添加到全局的配置文件rebar.config中,并把这个配置文件放置在如下目录:

1
~/.config/rebar3/rebar.config

查找Erlang包

搜索命令让你远程查找在Hex.pm上发布的Erlang包。你可以在查询语句里用正则表达式字符。

1
2
3
$ rebar3 hex search cowboy
cloudi_service_http_cowboy
cowboy

安装包

Rebar3能下载和安装Erlang包以及任何必要的依赖。在你的rebar.config文件里增加应用名字到deps配置项,然后运行命令:rebar3 compile。下面的例子,我们尝试使用两个Erlang包,cowboy和meck。

1
{deps, [cowboy, meck]}.
1
2
3
4
5
6
7
8
9
10
11
$ rebar3 compile
===> Verifying dependencies...
===> Fetching ranch ({pkg,<<"ranch">>,<<"1.0.0">>})
===> Fetching meck ({pkg,<<"meck">>,<<"0.8.2">>})
===> Fetching cowlib ({pkg,<<"cowlib">>,<<"1.0.1">>})
===> Fetching cowboy ({pkg,<<"cowboy">>,<<"1.0.0">>})
===> Compiling cowlib
===> Compiling ranch
===> Compiling meck
===> Compiling cowboy
===> Compiling myapp

想要安装一个Erlang包的指定版本?在配置中把应用名字和版本写在一个元组中。你可以在Hex主页上查询Erlang包的可用版本。

1
{deps, [{cowboy, “1.0.2”}, {meck, "0.8.3"}]}.

列出已安装的包

rebar3 deps 命令列出你本地已经安装的包。

1
2
3
$ rebar3 deps
cowboy (locked package 1.0.0)
meck (locked package 0.8.2)

卸载包

要卸载一个包,你首先要在rebar.config文件中将它删除,然后使用命令:rebar unlock。现在我们卸载meck包。

1
2
3
$ rebar3 unlock
$ rebar3 deps
cowboy (locked package 1.0.0)

进一步阅读

http://www.rebar3.org/

原文链接: https://medium.com/erlang-central/building-your-first-erlang-app-using-rebar3-25f40b109aad#.mmyp4pfgz