Elixir项目依赖编译突发失败:无代码/版本变更,报rebar_abort
解决未变更版本/代码时依赖编译报rebar_abort的问题
这种毫无征兆的编译失败确实挺闹心的——毕竟你既没升级Elixir/Erlang,也没改核心代码。结合你的环境(Elixir 1.6.4、Erlang 20.3.4、MacOS 10.13.4)和依赖列表,我整理了几个针对性的排查和解决步骤:
1. 彻底清理依赖缓存,从头构建
本地依赖缓存损坏是这类问题的高发原因,先把旧缓存清干净再重新拉取:
- 删除项目本地的构建和依赖目录:
rm -rf _build deps - 清除Hex包管理器的全局缓存:
mix hex.clean --all - 重新获取并编译依赖:
mix deps.get && mix deps.compile
2. 确认你的Erlang/Elixir环境真的没变动
有时候环境变化是隐性的,比如不小心切换了shell环境、版本管理器(asdf/kiex)自动切换了版本:
- 直接在项目目录下运行以下命令,确认版本和你预期一致:
elixir -v erl -v - 如果用了版本管理工具,检查本地项目的版本锁定:
- asdf用户:
asdf current - kiex用户:
kiex current
- asdf用户:
3. 针对预发布版本依赖的特殊排查
你的依赖里有几个预发布版本(比如grpc 0.3.0-alpha.2、gun 1.0.0-pre.5),这类版本的稳定性和依赖链容易出问题:
- 检查
grpc依赖的编译日志:运行mix deps.compile grpc --verbose,看具体是哪一步触发了rebar_abort - 确认系统编译工具链完整:MacOS上需要Xcode Command Line Tools,运行
xcode-select --install安装或更新 - 如果是OpenSSL相关的编译问题(Erlang依赖常遇到),可以指定库路径后再编译:
export LDFLAGS="-L/usr/local/opt/openssl/lib" export CPPFLAGS="-I/usr/local/opt/openssl/include" mix deps.compile
4. 获取详细错误日志定位根源
如果上面的步骤都没解决,一定要看完整的编译错误信息:
- 运行带
--verbose参数的编译命令,捕捉rebar_abort的前置错误:mix deps.compile --verbose
通常rebar_abort只是最终的错误码,前面会有具体的失败原因——比如某个依赖的rebar.config配置错误、缺少系统依赖库、或者上游包的源文件有变动。
内容的提问来源于stack exchange,提问作者Ole Spaarmann
相关产品推荐
相关产品推荐

