asdf升级Elixir和Erlang后:ssl.cipher_suites未定义报错如何解决
报错原因
该报错由Erlang版本不兼容导致,:ssl.cipher_suites/0 是Erlang/OTP 21及更早版本的内置API,从OTP 22开始已被官方正式移除。你升级Erlang版本后,应用的自有代码或第三方依赖仍在调用该已废弃API,触发运行时错误导致应用崩溃。
解决步骤
- 清理旧构建缓存
先终止所有应用相关进程,执行以下命令删除历史构建产物和旧依赖缓存:mix deps.clean --all rm -rf _build - 更新兼容新版本Erlang的依赖
绝大多数情况下该报错由旧版本的HTTP相关依赖(如hackney、httpoison)或Web框架依赖调用了旧API导致,执行全量依赖更新即可解决:
如果你定位到了具体触发报错的依赖,也可单独更新对应依赖,例如:mix deps.update --allmix deps.update hackney - 调整自有代码的SSL API调用
若更新依赖后仍报错,全局搜索项目代码中直接调用:ssl.cipher_suites/0的逻辑,替换为新版本Erlang支持的API写法,示例如下:
旧调用写法::ssl.cipher_suites()
新兼容写法::ssl.cipher_suites(:default, :"tlsv1.2")
第二个参数可根据你需要支持的TLS版本调整为:"tlsv1.3"等对应值。 - 验证asdf版本匹配
确认当前项目目录激活的Elixir与Erlang版本互相兼容,执行以下命令查看当前生效版本:
若版本不匹配,可修改项目根目录下的asdf current erlang asdf current elixir.tool-versions文件中的版本号,执行asdf install安装对应版本后再操作。 - 重新构建启动应用
执行以下命令重新安装依赖、构建项目并启动:mix deps.get mix compile iex -S mix
内容的提问来源于stack exchange,提问作者Tom Hale
相关产品推荐
相关产品推荐

