Erlang应用打包工具:node_package

[url=https://github.com/basho/node_package]node_package[/url]是一个制作[b]erlang应用[/b]安装包的脚本/模版集合。支持的平台包括deb(ubuntu), MacOSX, FreeBSD。

这里记录我使用过程中遇到的一些问题,备忘。

[size=x-large]一、前提[/size]

rebar.config中添加对node_package的依赖。

使用前保证rebar generate能正确打包。
另外,generate出来的应用目录下要有个data目录,可以在reltool.config目录里配置:
{overlay, [
{mkdir, "log"},
{mkdir, "data/《应用名》"},
.......


[size=x-large]二、起步[/size]
要想写自己的配置文件,可以拷贝[url=https://github.com/basho/stanchion]stanchion应用[/url],也可以参考riak,但是后者要复杂许多。

例如直接抄stanchion的Makefile有可能不会工作,出错的地方是这句:
git --git-dir=$${dep}/.git describe --tags >$${dep}/priv/vsn.git;

原因是有些依赖的应用的git describe得不到正常值,参考riak将这句改成:
printf "`git --git-dir=$${dep}/.git describe --long --tags 2>/dev/null || git --git-dir=$${dep}/.git rev-parse HEAD`" > $${dep}/priv/vsn.git;
即可

[size=x-large]三、陷阱[/size]
这个工具与版本控制git关系很密切。与之相关有两个陷阱要小心:

1. 修改了某些配置参数(如package名字: package_name)后一定要提交到版本控制库里才会生效。

2. 有些工程是根据git describe的结果计算某些变量的,而git describe要得到有意义的结果需要有tag,所以还得给app打上tag。如:
git tag -m "bala 1.0.0" 1.0.0

3. 写配置的时候可能需要不断的实验,这里又有陷阱,这个陷阱又和git的tag有关:

git commit --amend
或者git commit
后,要重新设置tag,因为tag不会自动更新到最新的修改提交。因此tag也需要手工更新到最新的提交。操作过程是删除旧tag,在当前提交(HEAD)上建一个新tag。

一般提交后可以这样:删除tag:
git tag -d 1.0.0

然后,重新打上tag:
git tag -m "bala 1.0.0" 1.0.0

然后用make package测试一下修改是否正确。如果一切顺利,制造好的应用deb安装包放在package/package目录下,另附送一个SHA摘要认证。

[size=x-large]四、配置[/size]

配置参数在pkg.vars.config中。这个没什么好说的,抄过来简单改一下就能用了。

比较麻烦的是还需要rel/vars.config中,后者其实是控制reltool工具进行generate的,但是由于用到了node_package/priva/base/runner脚本模板生成应用控制脚本(例如riak脚本),所以需要rel/vars.config控制某些环境参数。

在rel/reltool.config配置文件中,添加如下
{overlay_vars, "vars.config"}.
{overlay, [
...
{copy, "../deps/node_package/priv/base/erl", "\{\{erts_vsn\}\}/bin/erl"},

{template, "../deps/node_package/priv/base/runner", "bin/gfdatabus"},
{template, "../deps/node_package/priv/base/env.sh", "lib/env.sh"}


[size=x-large]五、其它[/size]

1. 包名
以上都是在ubuntu下测试的,最后一个陷阱是与dch有关,dch这个奇芭要求package的名字中不能有下划线,不然出错:
dch warning: illegal package name used with --package

所以你的应用名中也不要有下划线。


2. 其它疑难

如果打完deb成功,安装也成功,运行应用(假设应用叫xxx)的时候出现如下错误:
$ sudo xxx console
Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Error reading /etc/xxx/app.config

这个不是你的配置文件app.config的错误。这其实是reltool.config的配置出错:
{app, stdlib, [{mod_cond, derived}, {incl_cond, include}]},

正确的配置是:
{app, stdlib, [{incl_cond, include}]},

一般配置中不要有stdlib,kernel


参考
http://www.erlang-factory.com/upload/presentations/857/JaredEUC-2013.pdf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值