`
cryolite
  • 浏览: 572880 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang应用打包工具:node_package

阅读更多
node_package是一个制作erlang应用安装包的脚本/模版集合。支持的平台包括deb(ubuntu), MacOSX, FreeBSD。

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

一、前提

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

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


二、起步
要想写自己的配置文件,可以拷贝stanchion应用,也可以参考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;
即可

三、陷阱
这个工具与版本控制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摘要认证。

四、配置

配置参数在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"}




五、其它

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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics