服务器构建Elixir应用遇pc插件不可用及模块加载错误求助
解决Elixir生产构建时的"Plugin pc not available"模块加载错误
我来帮你搞定这个构建报错,这个问题本质是Erlang的pc插件(通常是某个依赖引入的编译插件)没有正确编译或加载,导致找不到模块必需的Atom段。先看看你遇到的具体报错:
执行构建命令:
APP="my_app" MIX_ENV="prod" AUTO_VERSION="" BRANCH="master" SKIP_RELUP_MODIFICATIONS="" RELUP_MODIFICATION_MODULE="" USING_DISTILLERY="true" mix do clean, compile出现错误:
===> Plugin pc not available. It will not be used. =ERROR REPORT==== 30-Apr-2018::10:21:55 === beam/beam_load.c(1287): Error loading module pc: mandatory chunk of type 'Atom' not found =ERROR REPORT==== 30-Apr-2018::10:21:55 === Loading of /tmp/edeliver/my_app/builds/deps/re...
下面是几个经过验证的解决方案,按顺序尝试即可:
1. 彻底清理并重建依赖缓存
缓存损坏是这类问题的常见原因,先把旧的构建文件和依赖全清掉,重新来:
# 清理项目和依赖的编译产物 MIX_ENV=prod mix clean --deps # 删除整个deps和_build目录,确保没有残留 rm -rf deps _build # 重新拉取所有依赖 MIX_ENV=prod mix deps.get # 重新编译项目 MIX_ENV=prod mix compile
2. 检查并修复引入pc的依赖版本
pc插件一般是由Erlang依赖(比如p1_utils这类库)带进来的,可能是依赖版本和你的Erlang/Elixir环境不兼容。打开项目的mix.exs,找到相关依赖,指定一个稳定兼容的版本,比如:
defp deps do [ # 如果是p1_utils导致的问题,指定稳定版本并强制覆盖 {:p1_utils, "~> 1.0", override: true} ] end
修改后重新执行上面的清理和编译步骤。
3. 确认Erlang版本兼容性
较新的Erlang版本对模块的结构要求更严格,可能和旧版本的pc插件不兼容。你可以用版本管理工具(比如asdf或kerl)切换到项目推荐的Erlang版本:
# 示例:用asdf切换到Erlang 21.3(根据项目实际需求调整) asdf install erlang 21.3 asdf local erlang 21.3
切换完成后重新执行构建命令。
4. 手动编译pc插件
如果上面的方法都不行,试试手动找到pc插件的源码目录(一般在deps/pc或者某个依赖的子目录里),手动编译它:
cd deps/pc rebar3 compile
编译完成后回到项目根目录,重新执行构建命令。
内容的提问来源于stack exchange,提问作者simo
相关产品推荐
相关产品推荐

