用于各种任务的推荐步骤和可能的默认配置。
如果你了解基础命令,已经阅读入门和基本用法,并且对发布(Releases)有简要的理解,那么下一步可能是为项目和团队制定工作流。
为对 Erlang 工具链有良好的体验,本节介绍用于各种任务的多个推荐步骤和可能的默认配置(WIP)。
项目类型 | 推荐模版 | 解释 |
---|---|---|
简短的脚本或工具 | escript | 用户需要安装 Erlang。C 中的依赖既不会被包含,也不会被重新分发 |
完整的、自包含的可执行系统 | release 或 umbrella | 这是用于 Erlang 系统的推荐的生产部署。查看 Releases 部分,获取关于发布的更多细节 |
在其它系统中使用的库 | lib 或 app | lib 用于包含模块的无状态库,app 用于带监督树的有状态库 |
多个库的集合 | umbrella | 这是支持使用多个顶级应用程序的一种项目形式。这些项目通常不能用作依赖。对于可用作依赖的项目,请查看 how to declaregit_subdir dependencies |
项目的基础配置应该至少做两件事:
rebar.lock
文件_build
目录追踪锁文件使你可以重复构建;当切换分支时,允许 Rebar3 执行自动地重新更新依赖之类的事情。
删除 _build 目录应该是安全的,但不需要这么做
Rebar3 追踪
rebar.config
文件中声明的所有应用程序,并且能够追踪所有必需的变更。有少许边缘情况,无法做到这些,并且可能导致奇怪的 Bug,特别是当改变项目结构时。如果正在从单应用程序项目转移到伞形项目(即所有源文件从src/
转移到apps/myapp/src
)或者相反,_build
目录中的多个制品将相互冲突。在这种情况下,删除它,并且执行一次新构建。
你希望做的下一件事情是向项目添加依赖。为此,请查看 Dependencies 部分。但是,添加依赖不会自动地将它们集成进项目。
{deps, [...]}
配置值告诉 Rebar3 获取、下载及追踪哪些依赖,但也就到此为止。然后必须配置应用程序使用这些依赖:
.app.src
文件中的 {applications, [stdlib, kernel, ...]}
元组下。这让 Erlang VM 知道在缺少依赖的情况下,不启动应用程序observer
或 recon
是应用程序不依赖的调试工具,但想捆绑它),那么需要显式地将该应用程序添加到 {releases, ... }
配置元组。该元组上的任何依赖也包含其传递依赖。其它构建工具倾向于不区分这些类型的项目包含,但 Rebar3 试图严格规定应该包含或不包含的内容。它可以让你运行特定的构建,比如不要特定工具链(比如 Wx 图形工具包)即可运行的 escript 或测试发布。
当升级依赖时,有两个必要步骤:
第一步是必须的,因为 Rebar3 维持以前获取过的 Hex.pm 存储库包和版本的缓存。这使得构建工具运行得更快,当计算机上存在所有已知和必需的版本时,无需无用的网络调用。但是,当存在新版本时,Rebar3 无法自动知晓。为告诉它去获取已知包的新版本定义,调用:
$ rebar3 update
这将更新 Hex 包,但不修改现有项目。
更改现有项目定义的唯一方式是通过修改锁文件。这很容易完成,调用:
$ rebar3 upgrade <depname>
这将更新锁文件定义,并且在下次构建,将获取及编译新拷贝。如果传递依赖也已升级,那么将被检测及处理。
应尽可能避免删除锁文件,如果需要更新多个依赖,可以调用 rebar3 upgrade dep1,dep2,dep3
。如果想更新所有依赖,调用 rebar3 upgrade --all
,这在小型项目上是可以的,但在大型项目上,可能需要逐步执行。
更复杂的项目可能运行多个工具。比如,你可能希望运行 xref
查找死代码,dialyzer
用于类型分析,ct
用于通用测试套件,cover
用于覆盖率分析等。
别名可以创建简单的命令运行多个任务,而非手动调用所有的任务:
{alias, [
{check, [xref, dialyzer, edoc,
{proper, "--regressions"},
{proper, "-c"}, {ct, "-c"}, {cover, "-v --min_coverage=80"}]}
]}.
该配置允许调用 rebar3 check
,它将依次运行下面的步骤:
dialyzer
检查不一致性和类型错误proper
中运行回归测试(使用 the PropEr plugin)cover
分析,向 Shell 输出结果。该别名也确保如果代码覆盖率下降到 80% 以下,那么命令失败一旦某个任务失败,那么整个命令被中断。可以根据需要调整别名。
优化任务延迟
节省时间的一个技巧是先运行较短的任务。比如
xref
会发现一些dialyzer
也能发现的问题,但速度快得多。在别名中,在 Dialyzer 之前运行xref
将给你更快的反馈循环。
一些 Rebar3 配置和默认值要么过于宽松,要么过于严格。但为保证向后兼容,不能总改变或调整它们,因为这样做可能破坏依赖这些特定配置的项目。
下面是一些配置的集合,在启动新项目时,这些配置可以用作新默认值。
{dialyzer, [
{warnings, [
%% Warn about undefined types and unknown functions
unknown
]}
]}.
{xref_checks,[
%% enable most checks, but avoid 'unused calls' which is often
%% very verbose
undefined_function_calls, undefined_functions, locals_not_used,
deprecated_function_calls, deprecated_functions
]}.
{profiles, [
{test, [
%% Avoid warnings when test suites use `-compile(export_all)`
{erl_opts, [nowarn_export_all]}
]}
]}.