分类: Erlang
基础知识
1.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)
- $mkdir -p apps/echo_serv
- $cd apps/echo_serv
- $ ../../rebar create-app appid=echo_serv
- `-- src
- |-- echo_serv.app.src
- |-- echo_serv_app.erl
- `-- echo_serv_sup.erl
- {sub_dirs, ["apps/echo_serv","rel"]}.
- ./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
- 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,复杂的升级操作需要手动修改