Elixir无法找到Erlang xmerl库的Phoenix项目编译问题求助
解决Phoenix项目编译时找不到xmerl.hrl的错误
问题根源
Erlang/OTP 27调整了xmerl的目录结构,同时Elixir 1.17的Record.extract/2在处理from_lib参数时,会严格匹配带版本号的Erlang库发布目录名。旧代码中使用的xmerl/include/xmerl.hrl路径不带版本号,导致无法匹配到实际存在的xmerl-2.0/include/xmerl.hrl路径。
解决方案
方案1:硬编码带版本的路径(快速临时修复)
直接修改代码中的路径,指定完整的带版本号的库路径:
defrecord(:xmlElement, extract(:xmlElement, from_lib: "xmerl-2.0/include/xmerl.hrl"))
注意:此方案依赖当前Erlang版本的xmerl版本号,更换Erlang版本后需要同步修改。
方案2:动态获取xmerl路径(推荐兼容性方案)
使用Erlang的:code.lib_dir/1函数动态获取xmerl的安装路径,避免硬编码版本号:
defrecord(:xmlElement, extract(:xmlElement, from: "#{:code.lib_dir(:xmerl)}/include/xmerl.hrl"))
:code.lib_dir(:xmerl)会自动返回当前Erlang环境中xmerl的正确库路径,适配不同版本的Erlang。
方案3:迁移到现代XML处理库(长期优化方案)
defrecord和直接操作xmerl records是较老旧的用法,推荐迁移到更符合Elixir生态的XML库,比如sweet_xml:
- 在
mix.exs的依赖列表中添加:{:sweet_xml, "~> 0.7"} - 替换原有基于
xmlElement的代码,使用sweet_xml的声明式语法处理XML,示例:import SweetXml # 替代原有的record解析逻辑 parsed_data = xml_content |> xpath(~x"//target_node/text()"s)
验证操作
修改代码后,执行以下命令清理旧编译产物并重新编译:
mix clean && mix deps.get && mix compile
同时确认当前激活的Erlang版本正确:
asdf current erlang
内容的提问来源于stack exchange,提问作者Shirraz
相关产品推荐
相关产品推荐

