使用 Rebar3 构建您的第一个 Erlang 应用程序

Rebar3 是 Erlang 的构建工具和包管理工具。借助 Rebar3及其Hex插件,创建和发布您的 Erlang 包非常简单。让我们做一个简单的“hello world”包,尝试一下吧!

下载 Rebar3

在此处下载最新版本:http://www.rebar3.org/

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

使用 chmod 为其添加执行权限,然后添加到环境变量 PATH中。

chmod +x rebar3 
export PATH=$PATH:your-current-directory

你的第一个 Erlang 应用

使用命令rebar3 new,将开始使用名为app的内置模板生成一个新项目。在此示例中,我们正在创建一个名为myapp的项目。其他可用模板有:release、lib、plugin、escript、cmake。

$ 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目录中。

$ cd myapp
$ tree
.
├── LICENSE
├── README.md
├── rebar.config
└── src
    ├── myapp.app.src
    ├── myapp_app.erl
    └── myapp_sup.erl

常见的是使用一个.app.src文件将您的应用程序定义为 OTP application,因为 Rebar3 仅处理OTP 结构化项目。看起来很熟悉?该文件也是 Erlang代码。查看完整的参考资料,看看它可以包含什么。

$ 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 应用程序:

$ 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可以包含很多字段。要查看它们,请查看完整示例

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

现在让我们使用 Rebar3 启动一个 Erlang shell,其中包含您的应用程序和路径中的依赖项。运行application:start(myapp).验证您的应用是否已正确加载。

$ 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

为了了解命令rebar3 shell,Fred Hebert《Learn You Some Erlang》的作者)在这里写了一篇很好的文章。

Erlang Packages

在你开始前

我们需要安装一个名为rebar3_hex的插件,以便从Erlang/Elixir 包管理器Hex.pm获取和安装 Erlang 包。只需将以下行添加到您的rebar.config文件中。(您需要 Erlang 版本 OTP 17.4 及以上)

{plugins, [rebar3_hex]}.

然后运行命令:rebar3 update以启用插件。

$ 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并将其放置在:

~/.config/rebar3/rebar.config

查找 Erlang 包

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

$ rebar3 hex search cowboy
cloudi_service_http_cowboy
cowboy

安装包

Rebar3 可以下载和安装 Erlang 包和任何必要的依赖项。将应用程序名称添加到rebar.config文件中的deps条目,然后运行命令:rebar3 compile。在这个例子中,我们尝试使用两个 Erlang 包,分别是cowboy和meck。

{deps, [cowboy, meck]}.$ 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 主页浏览软件包的可用版本。

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

列出已安装的软件包

rebar3 deps命令显示本地安装的包:

$ rebar3 deps
cowboy (locked package 1.0.0)
meck (locked package 0.8.2)

卸载软件包

要卸载一个包,你必须先从 rebar.config文件中删除它,然后使用命令:rebar3 unlock。在这里,我们从列表中删除了meck包。

$ rebar3 unlock
$ rebar3 deps
cowboy (locked package 1.0.0)

Related Posts

2021 年你需要知道的关于 Erlang 的一切

今天,我们将看一个相当古老且有些古怪的东西。 你们大多数人可能没有注意到的语言。 虽然 Erlang 不像某些现代编程语言那样流行,但它安静地运行着 WhatsApp 和微信等每天为大量用户提供服务的应用程序。 在这篇文章中,我将告诉你关于这门语言的更多事情、它的历史,以及你是否应该考虑自己学习它。 ## 什么是 Erlang,它在哪里使用? Erl

Read More

Erlang JIT中基于类型的优化

这篇文章探讨了 Erlang/OTP 25 中基于类型的新优化,其中编译器将类型信息嵌入到 BEAM 文件中,以帮助JIT(即时编译器)生成更好的代码。 ## 两全其美 OTP 22 中引入的基于SSA的编译器处理步骤进行了复杂的类型分析,允许进行更多优化和更好的生成代码。然而,Erlang 编译器可以做什么样的优化是有限制的,因为 BEAM 文件必须

Read More

Erlang JIT之路

自从Erlang 存在,就一直有让它更快的需求和野心。这篇博文是一堂历史课,概述了主要的 Erlang 实现以及如何尝试提高 Erlang 的性能。 ## Prolog 解释器 Erlang 的第一个版本是在 1986 年在 Prolog 中实现的。那个版本的 Erlang 对于创建真正的应用程序来说太慢了,但它对于找出Erlang语言的哪些功能有用,哪

Read More