Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5118959
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Erlang

2014-06-22 20:39:13

基础知识

1.erlang语言入门

看<>,更多细节需要看手册。然后手册也需要融会贯通,这一步比较费劲。

官方手册地址:

2.rebar构建工具

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


  1. myproject     ------------工程根目录,rebar执行文件放在此处
  2. |-- apps     ------------存放应用的目录,下面可以存放多个应用的目录
  3. | `-- echo_serv ---------echo_serv服务器代码目录
  4. | |-- ebin ---------编译之后的存放beam文件目录
  5. | `-- src ---------源代码目录
  6. `-- rel -------------发布程序用的文件夹
  7.     `-- files -------------发布过程中自动产生的文件夹
这是进行编译和发布之后的目录结构,下面从头开始进行说明.

1. 初始化


  1. $mkdir myproject
  2. $cd myproject

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

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


  1. $mkdir -p apps/echo_serv
  2. $cd apps/echo_serv
  3. $ ../../rebar create-app appid=echo_serv
这是就会在echo_serv下创建src目录,并生成三个文件

  1. `-- src
  2. |-- echo_serv.app.src
  3. |-- echo_serv_app.erl
  4. `-- echo_serv_sup.erl
4.在myproject目录下新建文件rebar.config,内容如下,指明要编译的目录

  1. {sub_dirs, ["apps/echo_serv","rel"]}.
5.编译,则会在echo_serv中生成ebin目录,并存放输出的beam文件

  1. ./rebar compile

6.发布程序

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

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

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



  1. {sys, [
  2.        {lib_dirs, ["../apps"]},
  3.        {erts, [{mod_cond, derived}, {app_file, strip}]},
  4.        {app_file, strip},
  5.        {rel, "mynode", "1",
  6.         [
  7.          kernel,
  8.          stdlib,
  9.          sasl,
  10.          echo_serv
  11.         ]},
  12.        {rel, "start_clean", "",
  13.         [
  14.          kernel,
  15.          stdlib
  16.         ]},
  17.        {boot_rel, "mynode"},
  18.        {profile, embedded},
  19.        {incl_cond, exclude},
  20.        {excl_archive_filters, [".*"]}, %% Do not archive built libs
  21.        {excl_sys_filters, ["^bin/.*", "^erts.*/bin/(dialyzer|typer)",
  22.                            "^erts.*/(doc|info|include|lib|man|src)"]},
  23.        {excl_app_filters, ["\.gitignore"]},
  24.        {app, sasl, [{incl_cond, include}]},
  25.        {app, stdlib, [{incl_cond, include}]},
  26.        {app, kernel, [{incl_cond, include}]},
  27.        {app, echo_serv, [{incl_cond, include}]}
  28.       ]}.
  29.   
  30.   
  31. {target_dir, "mynode"}.
  32.   
  33.   
  34. {overlay, [
  35.            {mkdir, "log/sasl"},
  36.            {copy, "files/erl", "\{\{erts_vsn\}\}/bin/erl"},
  37.            {copy, "files/nodetool", "\{\{erts_vsn\}\}/bin/nodetool"},
  38.            {copy, "files/mynode", "bin/mynode"},
  39.            {copy, "files/sys.config", "releases/\{\{rel_vsn\}\}/sys.config"},
  40.            {copy, "files/mynode.cmd", "bin/mynode.cmd"},
  41.            {copy, "files/start_erl.cmd", "bin/start_erl.cmd"},
  42.            {copy, "files/vm.args", "releases/\{\{rel_vsn\}\}/vm.args"}
  43.           ]}.

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


  1. rel$../rebar generate

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

  1. 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,然后


  1. 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,复杂的升级操作需要手动修改





阅读(2987) | 评论(0) | 转发(0) |
0

上一篇:erlang ranch

下一篇:Erlang资源搜集

给主人留下些什么吧!~~