能否为runtime.exs自定义名称与路径?客户端配置如何避免部署时被覆盖?
Elixir配置持久化与自定义配置文件解决方案
一、持久化自定义配置(避免部署覆盖)
别把串口编号这类自定义配置放在项目自带的config/runtime.exs里——新版本部署时这个文件大概率会被替换。正确的做法是:
- 将自定义配置单独存到应用代码目录之外的独立文件,比如
/usr/local/etc/my_app_custom.exs - 在项目默认的
runtime.exs末尾添加加载逻辑,启动时自动合并外部配置:
# runtime.exs 末尾追加 if File.exists?("/usr/local/etc/my_app_custom.exs") do import_config "/usr/local/etc/my_app_custom.exs" end
- 外部配置文件用和
runtime.exs完全一致的语法编写即可,比如:
config :my_app, :serial_settings, port: "/dev/ttyUSB0", baud_rate: 9600
Elixir的配置系统会自动处理合并逻辑,完全不需要手动解析。
二、用本地配置文件替代默认runtime.exs
完全可以,两种常用实现方式:
- 开发环境(mix启动):启动时通过
--config参数指定自定义文件
elixir --config /usr/local/etc/myprogram.exs -S mix run
- 生产环境(OTP Release):设置
RELEASE_CONFIG_FILE环境变量启动
RELEASE_CONFIG_FILE=/usr/local/etc/myprogram.exs _build/prod/rel/my_app/bin/my_app start
这样应用会直接加载你指定的配置文件,忽略默认的config/runtime.exs。
三、简便加载外部配置的原生方法
Elixir官方已经提供了完善的配置加载机制,根本不需要自己逐行解析:
- 用
import_config/1可以在现有配置文件中引入外部配置,自动完成合并 - 用启动参数/环境变量直接指定全局配置文件,完全替代默认文件
这两种方式都是原生支持,没有额外开发成本,比手动解析靠谱得多。
额外建议:如果只是部分配置需要自定义,优先用合并外部配置的方式,保留默认runtime.exs的基础逻辑,只覆盖需要自定义的项,这样后续版本更新时不会丢失默认配置的新特性。
内容的提问来源于stack exchange,提问作者Chen Yu
相关产品推荐
相关产品推荐

