Erlang sys.config与sys.config.src的用法

配置方式:

支持两种配置:

  • 配置引用的配置文件(一般不会用到)
  • 配置application下的key-value

例如:

%% sys.config
[
"./config/other_app/config.config", % 引用其他文件
  {mnesia, [ % application 为mnesia,该app下只有一个key配置就是dir
    {dir, "/data/database/app/mnesia"} 
  ]},
  {config, [ % application 为config,下面有三个配置
    {port, 8080},
    {link, 20000},
    {mode, super}
  ]
]

加载方式:

erlang启动时需要在erl命令后面跟上-config config目录来加载sys.config配置内容。

读取方式:

在代码中,使用application:get_env(1/2)来读取配置的内容。

例如:

1> application:get_env(mnesia, dir).
"/data/database/app/mnesia"
2> application:get_env(config, port).
8080
3> application:get_env(config, not_exist_key).
undfeined

sys.config.src

sys.config只能配置静态变量,所以引用目录或者根据不同的节点,定制一些不同的策略很难实现。sys.config.src增加了一个功能,就是可以引用变量。

需要搭配shell脚本使用,需要在shell中export变量,然后在sys.config.src中引用才可以。

例如:

% sys.config.src
{
  {my_app, [{port, ${PORT}}]} % port是环境变量,写法跟Shell 一样
}
# CTRL
export PORT=8080
export 
case "$1" in
  "start")
     ./bin/my_app console $@
   ;;
  "*")
     echo "start 交互式启动(同时打开erlang shell)"
   ;;
esac

# shell 
bash ctrl start
%% erlang shell
> application:get_env(my_app, port).
8080

进阶用法,在变量中运行更多命令

./
├── apps
│   └── ...
├── _build
│   └── ...
├── config
│   ├── sys.config.src
│   ├── sys.env # 环境变量导出
│   └── vm.args.src
├── ctrl # 引用sys.env导出的环境变量
├── rebar.config 
├── script
│   └── get_common_setting.es # 读取setting配置的脚本
├── setting
│   └── service.config
└── src
    └── ...
# sys.env
## ============ base ================= 
CUR_DIR=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)
ROOT_DIR=$(cd ${CUR_DIR}/../; pwd)

export ERL=$(readlink -f /usr/local/bin/erl)
export ESCRIPT=$(readlink -f /usr/local/bin/escript)

## ============ 私人定制 ===============
# 节点相关
ALL_ARGS_ARRAY=$(${ESCRIPT} "${ROOT_DIR}/script/get_setting.es game_id")
export GAME_ID=${ALL_ARG_ARRAY[0]}


Erlang sys.config与sys.config.src的用法
https://qiil.github.io/2022/10/18/Erlang-sys-config与sys-config-src的用法/
作者
QSY
发布于
2022年10月18日
许可协议