CI环境偶发Elixir标准库Base模块不可用报错如何解决
报错信息:
** (UndefinedFunctionError) function Base.hex_encode32/2 is undefined (module Base is not available)
问题核心逻辑
该报错和Elixir 1.8.2标准库无关,矛盾点为单独重跑测试步骤的运行环境与全量构建环境不一致,大概率是编译缓存冲突或模块命名覆盖导致。
可能成因
- 项目自身代码或引入的第三方依赖定义了同名
Base模块,编译后自定义模块的加载优先级高于Elixir标准库的Base模块 - Circle CI工作流缓存配置异常,单独重跑测试步骤时复用了其他环境(dev/prod)的编译产物,或缓存的编译产物存在损坏、版本不匹配问题
- 测试步骤的
MIX_ENV环境变量与依赖编译步骤的配置不一致,导致加载的编译产物不匹配
修复思路
- 全局检索项目代码与依赖的模块定义,排查是否存在自定义
Base模块:执行grep -r "defmodule Base" .查看输出,如果存在自定义模块直接重命名即可解决冲突 - 调整Circle CI缓存规则,禁止测试步骤单独复用跨步骤、跨环境的编译产物缓存:如果工作流拆分了
deps.get、compile、test为独立步骤,需确保test步骤依赖的compile步骤缓存键和测试环境强绑定,避免混用其他环境的编译缓存 - 在测试步骤的启动命令前增加强制清理旧编译产物的逻辑,执行
mix clean --deps && mix compile --force,确保测试运行前加载的是当前环境的全新编译产物 - 排查测试步骤的环境变量配置,确认
MIX_ENV的值与编译阶段的MIX_ENV完全一致,避免出现编译时用MIX_ENV=dev、测试时用MIX_ENV=test的不匹配情况
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

