从 Rebar 2.x 迁移到 Rebar3

Rebar3 对 rebar 2.x 做出了相当多的更改。总的来说,Rebar3 尝试在处理用纯 Erlang 编写的 OTP 应用程序时保持完全兼容性。因此,构建或编写标准 OTP 应用程序的人员将看到很少的不兼容性,尽管仍然需要做好准备。

主要更改包括(但不限于)将所有构建工件移动到 _build,以及更改获取依赖项的方式。

纯 Erlang,标准 OTP 应用程序

转换应用程序的第一步是删除旧的工件目录

  • 删除 ebin/ 目录。Rebar3 将读取并复制存在的 ebin/ 目录到其自己的 _build/ 子目录中,以便由其他工具生成的 .app.beam 文件保持可用。如果您使用的是 rebar 2.x,则 ebin/ 是它放置工件的地方,这些工件会与 Rebar3 冲突。
  • 如果您使用的是 relx,请删除 _rel/ 目录。Relx 现在已集成到 Rebar3 中,并将把其工件存储在 _build 中。
  • 删除 .rebar 目录。它不再使用。
  • 删除 deps/ 目录;依赖项现在位于 _build 中,这可以防止冲突。
  • .gitignore.hgignore 或其他文件中删除这些条目。

清理完这些目录后,可以简化 rebar.config 配置文件

  • 删除 sub_dirslib_dirs 条目,它们可能不再需要;rebar3 自动识别包含 Erlang 源文件和 OTP 应用程序的 src/apps/*lib/* 目录。

然后,您应该查看您的 .app.src 文件,以确保以下内容得到遵守

  • 您依赖的应用程序列在 applications 元组中
  • 没有循环依赖关系
  • 提到了以下字段(与版本一起使用!):descriptionvsnregisteredapplicationsenv

必需的目录结构

Rebar3 明确地只处理版本和 OTP 应用程序。依赖项应仅为 OTP 应用程序,每个条目一个。

确保您具有以下目录结构之一

src/*.{erl,app.src}

这是一种单目录、单应用程序结构。它适用于 OTP 应用程序、OTP 版本和具有单个顶级应用程序的 escript。src 目录将被递归搜索,并将处理文件,就像它们都位于顶级一样。

另一种形式是使用“伞形”结构

apps/app1/src/*.{erl,app.src}
apps/app2/src/*.{erl,app.src}
apps/app3/src/*.{erl,app.src}

lib/app1/src/*.{erl,app.src}
lib/app2/src/*.{erl,app.src}
lib/app3/src/*.{erl,app.src}

该格式将同时保存许多 OTP 应用程序,并且仅适用于版本和 escript,而不适用于可以用作依赖项的 OTP 库。

依赖项处理

Rebar3 现在支持 Hex 包和配置文件。因此,请考虑

  • 将您的依赖项移动到包中,请参阅 依赖项发布包
  • 将您的依赖项(如 meckPropEr)移动到 test 配置文件 以将其从常规构建中移除。很可能您的依赖项仍然包含它,因此它也可能保留在默认构建中,很遗憾。
  • 您不再需要告诉 Rebar3 获取依赖项,它只会在您告诉它编译或运行测试时知道。

另请注意,Rebar3 在之前完成编译后不再重新编译依赖项;如果您希望恢复该行为,请使用 _checkout 依赖项

Rebar3 也不再检查或强制执行依赖项版本,而是在发生冲突时使用“最靠近根目录”的依赖项选择算法。详细信息请参阅 依赖项

综上所述,并且您的项目已准备就绪,文档中的任何 Rebar3 指南都应该易于理解和适用。

其他注意事项和编译器

默认情况下,Rebar3 坚持使用 erlc 可用的编译器:Erlang、yecc、MIB 等。如果您有

  • C 代码,您将需要 将内容移动到 Makefile 或使用 端口编译器插件(与 rebar 2.x 向后兼容)
  • 如果您使用的是 QuickCheck 或 PropEr,则必须 使用该插件
  • diameter 有自己的插件
  • erlydtl 有自己的插件
  • 您在构建某些库时会遇到奇怪的构建工具交互问题,特别是 edown 和类似的库。如果遇到这些问题,前往 IRC 上的 #rebar 频道,社区成员会为您指明最简单的解决方法。
  • reltool 版本不再受支持,而是使用 Relx,并在 版本 中进行了说明

其他

  • 如果您仍在使用 Makefile 创建快捷命令,请考虑使用 别名
  • 对于代码覆盖率,您需要使用“cover”命令,例如“rebar3 do eunit, cover”。有关更多详细信息,请参阅 cover 文档。

在使用 Hex 包的同时保持向后兼容性

如果您想在大多数情况下使用 Rebar3 配置和选项,并为 Rebar 2 用户提供向后兼容性,请在 rebar.config.script 中添加类似于以下内容的内容,这将使旧版本的 Rebar 动态地放弃 Hex 包,并为它们提供机会包含现在是 Rebar3 中 profiles 部分的内容

case erlang:function_exported(rebar3, main, 1) of
    true -> % rebar3
        CONFIG;
    false -> % rebar 2.x or older
        %% Rebuild deps, possibly including those that have been moved to
        %% profiles
        [{deps, [
            {my_dep, "VSN", {git, "https://...", {tag, "VSN"}}},
            ...
        ]} | lists:keydelete(deps, 1, CONFIG)]
end.
上次修改时间:2021 年 5 月 6 日:审查所有与语言相关的元素 (511cdb9)