本帖最后由 茶叶feng 于 2018-9-4 19:06 编辑  
 
### 启动目标系统 
准备工作都搞定了,现在就是顺水推舟了 
``` 
erl -boot ./simple_cache -config ./sys 
``` 
启动完毕 
 
## 发布镜像打包 
之前只是完成了一部分,接下来还有呢 
 
### 创建发布镜像包 
废话不说,看命令 
``` 
erl -pa ./simple_cache/ebin -pa ./resource_discovery/ebin 
> systools:make_script("simple_cache", []). 
ok 
> systools:make_tar("simple_cache", [{erts, code:root_dir()}]). 
ok 
``` 
例子中,运行时系统(erts)在erlang的 安装目录下,用```code:root_dir()```可以定位,把erts从中复制出来,把erts在内的应用一并打包,这样的发布镜像就能在任何兼容主机上安装和启动了 
执行完上面的命令会发现,目录下面有一个```simple_cache.tar.gz```文件,这个不就是我们经常见的```.tar.gz```文件吗?赶紧解压看看? 
``` 
$ mkdir tmp 
$ cd tmp 
$ tar -xzf ../simple_cache.tar.gz 
``` 
或者打开erlang shell 
``` 
erl_tar:extract("simple_cache.tar.gz", [{cwd, "tmp"}, compressed). 
``` 
解压后目录如下 
``` 
tmp 
├── erts-8.3 
│   └── bin 
│       ├── erl.src 
│       ... 
├── lib 
│   ├── cache-0.1.0 
│   │   └── ebin 
│   │       ├── cache.app 
│   │       └── cache_app.beam 
│   ├── kernel-5.2 
│   │   └── ebin 
│   │       ... 
│   ├── mnesia-4.14.3 
│   │   └── ebin 
│   │       ... 
│   ├── resource_discovery-0.1.0 
│   │   └── ebin 
│   │       ├── resource_discovery.app 
│   │       ... 
│   ├── sasl-3.0.3 
│   │   └── ebin 
│   │       ... 
│   └── stdlib-3.3 
│       └── ebin 
│           ... 
└── releases 
    ├── 0.1.0 
    │   ├── simple_cache.rel 
    │   ├── start.boot 
    │   └── sys.config 
    └── simple_cache.rel 
``` 
解压后,安装镜像时,需要将```erts-8.3/bin/erl.src```文件中```%FINAL_ROOTDIR%```替换成目标系统上的真实路径,然后再把```erl.src```的内容复制给```erts-8.3/bin/erl```文件,这个路径是你想要安装的路径,比如我想把它安装的机器它的安装在```C:\Program Files\simple_cache```,那我就把文件内容改成下面那样 
``` 
# ROOTDIR="%FINAL_ROOTDIR%"原来的 
ROOTDIR="C:/Program Files/simple_cache" 
BINDIR=$ROOTDIR/erts-8.3/bin 
EMU=beam 
PROGNAME=`echo $0 | sed 's/.*\///'` 
export EMU 
export ROOTDIR 
export BINDIR 
export PROGNAME 
exec "$BINDIR/erlexec" ${1+"$@"} 
``` 
如果没有改这个路径的话,程序是不能正常运行的 
如果你系统中已经安装了erlang,想要用erl的安装路径,你可以试试,反正我试过不行 
现在能运行了吗? 
能! 
在tmp目录下执行 
``` 
erts8.3/bin/erl -sname cache -boot ./release/0.1.0/start -config ./release/0.1.0/sys 
``` 
搞定! 
 
### 增加安装和启动脚本 
对于非技术人员来说,打包成上面那样,部署工作还是有点麻烦的难以理解的,所有我们尽量简化,就加入了脚本 
在解压后的tmp目录中,创建bin目录,写个shell脚本,自己补补shell吧,反正我也是用到了才去学的,下面是安装脚本```install.sh``` 
``` 
#!/bin/sh 
ROOT=`pwd` 
DIR=./erts-8.3/bin 
sed s:%FINAL_ROOTDIR%: $ROOT: $DIR/erl.src > $DIR/erl 
``` 
这个脚本用来替换```erl.src```文件中的```%FINAL_ROOTDIR%```然后输出到```erl``` 
还有个启动脚本```simple_cache.sh``` 
``` 
./erts-8.3/bin/erl \ 
-sname cache \ 
-boot ./releases/0.1.0/start \ 
-config ./releases/0.1.0/sys \ 
-detached 
``` 
写好了记得加执行权限 
 
最后,把脚本一起打包进发布镜像中,在tmp目录下的erlang shell中 
``` 
erl_tar:create("simple_cache-0.3.0.tar.gz", ["erts-8.3", "lib", "releases", "bin"], [compressed]). 
``` 
也可以用tar命令 
``` 
tar -czf simple_cache-0.3.0.tar.gz bin erts-8.3 lib releases 
``` 
这样一来,部署应用就只有三个步骤 
1. 解压部署包```simple_cache-0.3.0.tar.gz``` 
2. 执行安装脚本```install.sh``` 
3. 执行运行脚本```simple_cache.sh``` 
 
最后,欢迎指出错误 
 
 |