使用edeliver部署Phoenix应用时遇Application.compile_env/4匹配错误
问题解决指南:Phoenix 1.6.15 edeliver构建错误及部署方案建议
一、解决Application."MACRO-compile_env"/4函数子句匹配错误
这个错误的核心原因是构建环境与开发环境的Elixir版本不匹配,或代码中Application.compile_env的调用参数有误:
- 对齐Elixir版本要求
Phoenix 1.6.15强制要求Elixir 1.12及以上版本,而Application.compile_env/3是Elixir 1.12才引入的宏。如果edeliver构建时使用的Elixir版本低于1.12,就会触发该错误:
- 先执行
elixir -v确认开发环境的Elixir版本 - 在项目根目录的
.deliver/config文件中添加配置,强制edeliver使用对应版本:export ELIXIR_VERSION="你的Elixir版本号" # 例如 export ELIXIR_VERSION="1.14.4"
- 检查Guardian配置代码
打开lib/pxf/auth/guardian.ex,排查所有Application.compile_env调用:
- 确保调用参数为3个:
Application.compile_env(:你的应用名, Guardian, 默认值),如果写了4个参数,直接删除多余部分 - 示例正确写法:
secret_key = Application.compile_env(:pxf, Guardian, secret_key: "") |> Keyword.get(:secret_key)
- 验证修复效果
先在本地模拟生产环境编译:
MIX_ENV=prod mix compile
若编译通过,再执行mix edeliver build release --verbose
二、关于edeliver是否适合当前部署的建议
edeliver曾经是Elixir生态的主流部署工具,但目前官方更推荐使用内置的mix release,原因如下:
mix release从Elixir 1.9开始内置,无需额外安装依赖,配置更简洁- Phoenix 1.6默认支持
mix release,官方维护和更新更及时 mix release直接生成独立可执行文件,支持热更新、环境变量配置、容器化部署等现代需求- edeliver更新频率较低,对新版本Phoenix和Elixir的适配存在滞后
如果切换到mix release,基础步骤:
- 确认
mix.exs中releases配置正确(Phoenix 1.6默认已配置) - 执行
MIX_ENV=prod mix release生成发布包 - 将
_build/prod/rel/你的应用名目录部署到服务器,通过bin/你的应用名 start启动服务
内容的提问来源于stack exchange,提问作者tmariaz
相关产品推荐
相关产品推荐

