Erlang中文论坛

标题: erlang.mk使用(4) [打印本页]

作者: 茶叶feng    时间: 2018-11-8 14:03
标题: erlang.mk使用(4)
有道云 http://note.youdao.com/noteshare ... 21FA24EF699F57A0C9B
#### 发布(Releases)
##### 建立(Setup)
erlang.mk如果在```$(RELX_CONFIG)```目录检测到一个relx配置文件的话会创建一个版本,默认是```$(CURDIR)/relx.config,你也可以在引用erlang.mk前修改这个默认值
```
RELX_CONFIG = $(CURDIR)/webchat.config
```
relx不需要安装,erlang.mk会自动下载构建

可执行的relx会保存到```$(RELX)```文件,默认位置在```$(CURDIR)/relx```,这个位置也可以在配置中覆盖

##### 配置(Configuration)
你可以通过```RELX_OPTS```变量指定relx其它的选项,例如开启```dev_mode```:
```
RELX_OPTS = -d true
```
指定输出目录有特定的变量```RELX_OUTPUT_DIR```,默认是```_rel```,你也可以改成这样:
```
RELX_OUTPUT_DIR = /path/to/staging/directory
```

##### 生成版本(Generating the release)
如果erlang.mk检测到```$(RELX_CONFIG)```文件的话,是会自动生成版本的,所以直接用```make```命令就能生成
如果更明确点,直接用```make rel```命令,erlang.mk经常和版本一起生成能直接上传到服务器的压缩包,压缩包位置在```$(RELX_OUTPUT_DIR)/<name>/<name>-<vsn>.tar.gz```

##### 运版本(Running the release)
执行```make run```命令就能跑release了,如果还没有构建生成版本,它会先构件生成然后才开始跑,这个方式启动会在命令行模式启动版本

##### 更新发布包(Upgrading a release)
erlang.mk提供了```make relup```命令用来生成升级版本,如果有版本正在运行,更新的时候可以不用重启它也能生效
当你完成修改更新应用时,你也需要更新发布的版本
更新应用时,更新文档必须要写好,参考erlang/otp文档
如果完成所有工作,你想更新版本,先构建一个压缩包```make relup```,这会创建一个在版本目录下创建一个目录
```
$RELX_OUTPUT_DIR/example/example-2.tar.gz
```
把压缩包移动到要更新版本的位置
```
mkdir releases/2/
mv path/to/example-2.tar.gz releases/2/
```
最后执行更新版本
```
bin/example_release upgrade "2/example_release"
```

##### 获取relx语义化版本值(Getting Relx semver value)
有一个通过vcs历史生成relx的方式,以此获取语义化版本值的办法
创建一个```rel/version```文件,内容为
```
{{release_version}}
```
添加/更改```relx.config```的overlay部分:
```
{
    overlay, [
        {template, "rel/version", "version"}
    ]
}.
```
你运行```make rel```时就会创建包含relx版本值的```$(RELX_OUTPUT_DIR)/example/version```文件
```
cat _rel/app/release
1.0.0+build.11.ref5612aa0
```
在你Makefile中可以用这个简单片段来获取版本号,要注意这是取决于rel目标的:
```
$(shell cat $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/version)
```
例如:
```
include erlang.mk

APP_VERSION = $(shell cat $(RELX_OUTPUT_DIR)/$(RELX_REL_NAME)/version)
myrecipe: all
        echo APP_VERSION = $(APP_VERSION)
```

#### 自解压版本(Self-extracting releases)
erlang.mk允许你打包relx release成自解压存档,这个存档包含release的所有文件,通过脚本提取文件并且自动运行release

##### 生成自解压文档(Generating the self-extracting archive)
你需要做的是,构建release的时候,传递```SFX=1```参数给```make```命令:
```
make SFX=1
```
这会创建一个自解压存档到```$RELX_OUTPUT_DIR/<name>.run```,如果release名为hello_world,那就会创建一个
```_rel/hello_world.run``` 文件

##### 运行版本(Running the release)
很简单
```
./_rel/hello_world.run
```
存档脚本在运行版本前,会提取文件到一个临时的路径
自解压脚本现在只支持运行在命令行模式

#### 脚本(Escript)
脚本是发布版本的替代方案,它需要通过erlang中的一些命令来使用
不像release,脚本不是独立的,erlang必须要先安装好,这也意味着它会比release小得多

#### 要求(Requirements)
erlang.mk默认用p7zip生成escript存档,所以要确保它已经安装在你的os
如果p7zip不行,可以改成用zip:
```
make escript ESCRIPT_ZIP=zip
```

#### 生成脚本(Generating an escript)
执行命令
```
make escript
```
默认是在项目目录下生成和项目同名的escript,如果项目名是relx,脚本就是./relx
运行脚本:
```
./relx
```

#### 配置(Configuration)
```ESCRIPT_NAME``` 变量可以修改脚本名,它同时决定输出文件名和它整个模块入口main/1的模块名
```ESCRIPT_FILE``` 可以修改脚本名和脚本路径
```SECRIPT_SHEBANG``` 可以修改脚本的第一行
```SCRIPT_COMMENT``` 修改脚本的注解
```SCRIPT_EMU_ARGS``` vm的参数,脚本运行的时候会用到
```SCRIPT_ZIP``` 前面说过了

#### 其他文件(Extra files)
生成escript分为两个过程
- 用escript的内容先创建一个zip文件
- 将header添加到该文件从而创建escript
你可以在两个步骤中间添加命令,例如:
```
escript-zip::
    $(verbos) $(ESCRIPT_ZIP) $(ESCRIPT_ZIP_FILE) priv/templates/*
```
```ESCRIPT_ZIP``` 变量包含添加文件到zip存档 ```ESCRIPT_ZIP_FILE``` 的命令

##### 优化大小(Optimizing for size)
erlang.mk默认带debug信息地编译beam文件,如果你想取消这个从而获取更小的escript文件,```ERLC_OPTS``` 参数去掉```+debug_info```参数






欢迎光临 Erlang中文论坛 (https://bbs.erldoc.com/) Powered by Discuz! X3.3