首页 > 解决方案 > 降级 Erlang/OTP 后加载/重新编译 Rebar 模块

问题描述

我希望使用 erlang 客户端库与我的一个项目的 mqtt 代理进行通信。所以我使用 rebar3 的内置模板启动了一个应用程序,并添加了 emqttc 作为依赖项。由于erlang/otp 21 不支持 gen_logger(emqttc 依赖于 gen_logger)并且tuple_calls编译器选项不够,我不得不根据这篇文章降级到 erlang@20 。

现在降级 erlang 的问题是,rebar3 的命令(clean/compile/shell/report 等)都没有按预期工作,而且我以前用 rebar3 构建的项目无法编译,我看到这个错误消息:

=错误报告==== 21-Aug-2018::12:54:29 === 加载 /usr/local/bin/rebar3/rebar/ebin/rebar3.beam 失败:badfile escript:异常错误:未定义函数rebar3:main/1 在函数 escript:run/2 (escript.erl,第 759 行)中从 escript:start/1 调用中(escript.erl,第 277 行)在从 init 调用中:start_em/1 在从 init 调用中:do_boot /3

=错误报告==== 21-Aug-2018::12:54:29 === beam/beam_load.c(1863): 加载模块 rebar3 时出错:此 BEAM 文件是为更高版本的运行时编译的系统高于 20。要解决此问题,请使用 20 编译器重新编译此模块。(使用操作码 160;此仿真器最多支持 159。)

我已经卸载并重新安装了 rebar3,在网上查找了这个,但没有什么是明确的和特定于 rebar 的。对此的任何帮助将不胜感激。

标签: erlangrebar3

解决方案


这可能不是您问题的确切答案。但它可能会给你和想法。

使用Docker怎么样。这是保持环境清洁和整洁的简单方法。

如果您使用 docker,您只需将新的 erlang 版本Dockerfile作为环境变量包含在其中。

ENV OTP_VERSION="20.3.6"


推荐阅读