使用rebar构建erlang工程,手把手入门版

本文详细记录了作者从ERLANG语言基础到完成一个Echo_serv服务器的开发经历,包括初始化环境、应用模板创建、编译与发布流程。分享了在学习过程中的挑战与解决方案,强调了ERLANG的构建工具REBAR的重要性,以及目录结构设计的细节。文章还提到了如何使用REBAR在线升级和解决bug的方法,旨在帮助后来者减少摸索时间,共同进步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己花了几个星期时间,从erlang语法入门到完成一个用rebar发布一个echo_serv服务器。其中坎坷,实在难以言表。特此留下博客一篇,方便后来人。更欢迎erlang爱好者和我交流,一起成长。抱怨一下,写博客好痛苦,格式太难弄了


基础知识

1.erlang语言入门

看<<Erlang程序设计中文版>>,更多细节需要看手册。然后手册也需要融会贯通,这一步比较费劲。

官方手册地址:点击打开链接

2.rebar构建工具

使得编写符合OTP框架的应用和发布程序变得简单很多。网上各种教程错误白出,让我苦不堪言。官方教程也语焉不详,可能是我理解能力比较差。我用的rebar 是2012-02-21时从官网下载的版本。rebar版本之间还是有不同的


目录结构

myproject 	------------工程根目录,rebar执行文件放在此处
|-- apps  	------------存放应用的目录,下面可以存放多个应用的目录
|   `-- echo_serv  ---------echo_serv服务器代码目录
|       |-- ebin   ---------编译之后的存放beam文件目录
|       `-- src    ---------源代码目录
`-- rel        -------------发布程序用的文件夹
    `-- files  -------------发布过程中自动产生的文件夹


这是进行编译和发布之后的目录结构,下面从头开始进行说明.

1. 初始化

$mkdir myproject
$cd myproject

2.rebar执行文件拷贝到myproject目录下。rebar获取方法网上教程很多,没有问题。

3. 创建应用模板, 应用的名字必须和文件夹名字相同(echo_serv)

myproject$mkdir -p apps/echo_serv
myproject$cd apps/echo_serv
myproject/apps/echo_serv$ ../../rebar create-app appid=echo_serv

这是就会在echo_serv下创建src目录,并生成三个文件

`-- src
    |-- echo_serv.app.src
    |-- echo_serv_app.erl
    `-- echo_serv_sup.erl


4.在myproject目录下新建文件rebar.config,内容如下,指明要编译的目录


{sub_dirs, ["apps/echo_serv","rel"]}.

5.编译,则会在echo_serv中生成ebin目录,并存放输出的beam文件

./rebar compile


6.发布程序

$mkdir rel
$cd rel
rel$../rebar create-node nodeid=mynode

这一步mynode名字取什么都没有关系。这时rel文件夹中会多出来reltool.config文件和file文件夹

reltool.config文件需要修改一下,如下

{sys, [
       {lib_dirs, ["../apps"]},
       {erts, [{mod_cond, derived}, {app_file, strip}]},
       {app_file, strip},
       {rel, "mynode", "1",
        [
         kernel,
         stdlib,
         sasl,
         echo_serv
        ]},
       {rel, "start_clean", "",
        [
         kernel,
         stdlib
        ]},
       {boot_rel, "mynode"},
       {profile, embedded},
       {incl_cond, exclude},
       {excl_archive_filters, [".*"]}, %% Do not archive built libs
       {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
                           "^erts.*/(doc|info|include|lib|man|src)"]},
       {excl_app_filters, ["\.gitignore"]},
       {app, sasl,   [{incl_cond, include}]},
       {app, stdlib, [{incl_cond, include}]},
       {app, kernel, [{incl_cond, include}]},
       {app, echo_serv, [{incl_cond, include}]}
      ]}.


{target_dir, "mynode"}.


{overlay, [
           {mkdir, "log/sasl"},
           {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
           {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"},
           {copy, "files/mynode", "bin/mynode"},
           {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
           {copy, "files/mynode.cmd", "bin/mynode.cmd"},
           {copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
           {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
          ]}.

修改完毕之后就可以产生发布文件了。这一步之前代码一定要编译完成

rel$../rebar generate

这时在rel文件夹下产生mynode目录,将mynode文件夹打包,就可以放到其他机器任意目录下解包执行了。

rel$./mynode/bin/mynode console


使用start选项启动程序时,mynode脚本会使用 ./mynode/etc/vm.args中的参数作为erl的启动参数。要想修改vm.args文件中的默认参数,需要重新编译rebar,使用新的rebar重新执行../rebar generate。具体是修改rebar源码中的/priv/templates/simplenode.vm.args。再有个方法就是使用自己的template。自己的template放到~/.rebar/templates,然后

rebar create template=mytemplate

用rebar来在线升级

otp15B的版本中有个bug会导致systools:make_relup失败,需要修改otp15B源码进行修改,

修改看此链接点击打开链接,关于这个问题的讨论点击打开链接

错误表现如下,大体上是由于.app文件里start_phases设置为undefined

==> rel (generate-upgrade)
ERROR: Systools [systools:make_relup/4] aborted with: [{error_reading,
                                                        {sasl,
                                                         {{bad_param,....

修改完毕编译安装就可以用rebar来进行热代码更新了。

过程同官方点击打开链接,操作在rel目录下进行。截止发稿时期,rebar还不能产生降级(downgrade)的文件,只支持升级(upgrade)。升级也有诸多限制,目前只支持add,remove,update,复杂的升级操作需要手动修改


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值