设为首页收藏本站

Erlang中文论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 670|回复: 0

erlang服务端打包1

[复制链接]
发表于 2018-9-4 18:19:11 | 显示全部楼层 |阅读模式
## erlang应用打包、服务和部署
打包一个erlang应用,就以为这这个应用能够自主运转,所以我们要把运行在同一erlang运行时系统的多个应用捆绑在一起,下面我就一步步用我已知的东西说一下怎么打包发布一个erlang应用吧

### 样例说明
我用的例子是我照着erlang otp并发编程实战这本书写的一个叫```simple_cache```的项目,我在命名上可能和书上的有点不同,结构基本上一致,它包含两个应用,```simple_cache```和```resource_discovery```,它需要先启动```resource_discovery```再启动```simple_cache```才能正常运行
项目的目录大致如下
```
├── bin
│   ├── install
│   └── simple_cache
├── erts-8.3
│   └── bin
│       ├── erl
│       ...
├── lib
│   ├── cache-0.1.0
│   │   └── ebin
│   │       ├── cache.app
│   │       ├── cache_app.beam
│   │       ├── cache_element.beam
│   │       ├── cache_event.beam
│   │       ├── cache_event_logger.beam
│   │       ├── cache_manager.beam
│   │       ├── cache_store.beam
│   │       ├── cache_sup.beam
│   │       ├── custom_error_report.beam
│   │       ├── root_sup.beam
│   │       ├── server.beam
│   │       └── test_server.beam
│   ├── kernel-5.2
│   │   └── ebin
│   │       ...
│   ├── mnesia-4.14.3
│   │   └── ebin
│   │       ...
│   ├── resource_discovery-0.1.0
│   │   └── ebin
│   │       ├── resource_discovery.app
│   │       ├── resource_discovery_app.beam
│   │       ├── resource_discovery.beam
│   │       └── resource_discovery_sup.beam
│   ├── sasl-3.0.3
│   │   └── ebin
│   │       ...
│   └── stdlib-3.3
│       └── ebin
|           ...
└── releases
    ├── 0.1.0
    │   ├── simple_cache.rel
    │   ├── start.boot
    │   └── sys.config
    └── simple_cache.rel
```

## 准备发布镜像
若干应用加上一些元数据,便构成了发布镜像,其中元数据用于描述如何以系统的方式启动和管理这些应用。

发布镜像主要有以下步骤
1. 确定需要包含哪些应用
2. 创建用于描述镜像内容的元数据(.rel)文件
3. 创建启动脚本
4. 创建系统配置文件(可选)
5. 将所有内容打包成单个文件

### 确定包含的应用
确定镜像包含的应用,除了主要的业务应用```simple_cache```和```resource_discovery```外,还需要包含它们直接或者间接依赖的```kernel, stdlib, mnesia, sasl```

### 创建.rel
正如每个应用都有一个存放应用元数据的.app文件一样,发布镜像也需要一个存放元数据的发布镜像文件,即.rel文件,它需要将所有镜像用到的应用名和版本号包含在内,即使只是应用下面的应用库,我在root目录下创建的simple_cache.rel文件如下

```
{release,                             
    {"simple_cache", "0.1.0"},
    {erts, "8.3"},
    [
        {kernel, "5.2"},
        {stdlib, "3.3"},
        {mnesia, "4.14.3"},
        {resource_discovery, "0.1.0"},
        {simple_cache, "0.1.0"},
        {sasl, "3.0.3"}
    ]
}.
```
可以看到,和.app文件相似,第一个是原子```release```,后面是发布镜像名和版本号,为了保证在同一个版本的erts下运行,必须指定erts版本,通过```erl```命令打开虚拟机可以看到,接下来就是一个列表指定所有依赖应用的版本

### 创建脚本和启动文件
这不比较简单,在root目录启动erl
```
erl -pa ./simple_cache/ebin -pa ./resource_discovery/ebin
```
调用函数systools:make_cript/2,提供.rel文件中的镜像名和[local]参数
```
systools:make_script("simple_cache", [local]).
```
这样就能在当前目录下看到两个生成文件
```simple_cache.script``` 和 ```simple_cache.boot```
其中[local]是为.script文件和.boot文件提供的是绝对路径,这种路径仅在本地环境才有意义,如果要用于生产环境,建议用```systools:make_script("simple_cache", []).```
这里我们用local就好啦

接下来我们就能在root目录下输入

```erl -boot simple_cache```
来启动应用了

### 系统配置
为了方便使用,我觉得每个系统都有个配置文件也是不过分的
是要在项目中添加.config的文件,然后在启动erlang虚拟机时增加参数```-config ConfigPath```就可以把配置载入到虚拟机,运行时调用application:get_env/1 2就能取得对应的配置
我的配置文件放在root目录下,sys.config:
```
[
    {sasl,
        [
            {sasl_error_logger, {file, "/tmp/simple_cache.sasl_log"}}
        ]
    },  
    {simple_cache,
        [                                                               
            {contact_nodes, ['contact1@localhost', 'contact2localhost']}
        ]
    }
].
```
听从作者的建议,我还加入了sasl日志文件路径的配置,配置的格式比较容易看懂,```sasl```和```simple_cache```都是应用名称,和它配对的是一个键值对列表,表示每个应用有多个配置,加入我要加一个```resource_discovery```应用的配置,则要写成下面那样:

```
[
    {sasl,
        [
            {sasl_error_logger, {file, "/tmp/simple_cache.sasl_log"}}
        ]
    },  
    {simple_cache,
        [                                                               
            {contact_nodes, ['contact1@localhost', 'contact2localhost']}
        ]
    }
    {resource_discovery,
        [                                                               
            {test_config, test_value}
        ]
    }
].
```
则获取配置可以这么写```application:get_env(resource_discovery, test_config)```,将会得到```{ok, test_value}```的结果
还有,注意配置最后的```.```
后续请看 erlang服务端打包2


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Erldoc.com  

GMT+8, 2019-7-23 23:47 , Processed in 0.024161 second(s), 10 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表