You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:

  1. 在mix.exs的依赖列表中添加:
    {:sweet_xml, "~> 0.7"}
    
  2. 替换原有基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:42:42