从 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_dirs
和lib_dirs
条目,它们可能不再需要;rebar3 自动识别包含 Erlang 源文件和 OTP 应用程序的src/
、apps/*
和lib/*
目录。
然后,您应该查看您的 .app.src
文件,以确保以下内容得到遵守
- 您依赖的应用程序列在
applications
元组中 - 没有循环依赖关系
- 提到了以下字段(与版本一起使用!):
description
、vsn
、registered
、applications
、env
必需的目录结构
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 包和配置文件。因此,请考虑
- 将您的依赖项移动到包中,请参阅 依赖项 和 发布包
- 将您的依赖项(如
meck
和PropEr
)移动到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.