【问题标题】:Load/Recompile Rebar Modules after downgrading Erlang/OTP降级 Erlang/OTP 后加载/重新编译 Rebar 模块
【发布时间】:2019-01-27 08:58:11
【问题描述】:

我希望使用 erlang 客户端库与我的一个项目的 mqtt 代理进行通信。所以我使用 rebar3 的内置模板启动了一个应用程序,并添加了 emqttc 作为依赖项。由于erlang/otp 21 does not have support for gen_logger(emqttc 依赖于gen_logger) 和tuple_calls 编译器选项不够用,我只好根据this post 降级到erlang@20。

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

=错误报告==== 2018 年 8 月 21 日::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 从调用 初始化:do_boot/3

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

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

【问题讨论】:

  • 你是从哪里安装钢筋的?
  • 来自 Homebrew 的@legoscia
  • 我从我的 macOS high sierra 中卸载了 erlang20 和 rebar3 并通过 homebrew 重新安装了它们,只是意识到 homebrew 将 erlang21 视为 rebar3 依赖项并在倒入 rebar3 之前倒入 erlang21 公式。而且我遇到了钢筋模块没有再次加载/编译的相同错误。

标签: erlang rebar3


【解决方案1】:

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

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

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

ENV OTP_VERSION="20.3.6"

【讨论】:

    【解决方案2】:

    检查您的 _build/prod/rel/YOURAPPNAME/ 目录。很可能它的版本与您的 erlang 版本不匹配。您可以安全地删除此目录并使用 rebar3 compile 进行重建

    【讨论】:

      猜你喜欢
      • 2020-01-11
      • 1970-01-01
      • 2022-08-15
      • 2021-03-11
      • 2020-02-23
      • 1970-01-01
      • 2023-04-02
      • 2012-01-17
      • 2013-04-08
      相关资源
      最近更新 更多