配置脚本
使用 rebar.config
和 *.app.src
,您可以利用基于 file:script/2 的动态配置。
如果在原始文件所在的同一目录下存在 <name>.script
(对于 rebar.config
来说,就是 rebar.config.script
),则会评估脚本文件,并将结果用作配置。
为了方便起见,在评估期间,脚本中可以使用两个绑定(变量)
CONFIG
- 如果正在评估的脚本文件也存在,则为 file:consult/1 的结果
没有 .script
扩展名。否则,为 []
。
SCRIPT
- 正在评估的脚本的文件名
在所有情况下,脚本返回的数据(即文件中最后评估的内容)必须与原始非脚本文件格式相同。例如,如果我有一个 rebar.config.script
,则该脚本必须返回 Rebar3 配置数据,如果它是一个 <app-name>.app.src.script
,则它必须返回应用程序元数据格式的数据。
每个脚本都可能在每个 Rebar3 执行过程中执行多次。最好避免脚本产生非 幂等 的副作用。
简单示例
如果您正在构建相当复杂的系统,每次都去 GitHub 获取依赖项会减慢您的开发周期。在本地提供依赖项可能是更快的方法,但您不希望修改 rebar.config
并因此导致合并冲突。
以下 rebar.config.script
文件可以集中存储,并链接到您的应用程序目录
case os:getenv("REBAR_DEPS") of
false -> CONFIG; % env var not defined
[] -> CONFIG; % env var set to empty string
Dir ->
lists:keystore(deps_dir, 1, CONFIG, {deps_dir, Dir})
end.
每当您想“正确”构建(您应该定期这样做)时,只需调用 unset REBAR_DEPS
(或等效命令),并执行干净构建。
请注意,file:script/2
与 file:consult/1
不同,因为它只返回最后一个表达式的结果。因此,您必须注意返回配置项列表。在此之前,您可以进行任何形式的 I/O 操作(包括网络操作),检查操作系统环境变量,读取文件(可能在其他文件上调用 file:script/2
)或写入文件。您基本上可以使用所有 OTP 库。与 file:eval/2
一样,每个表达式都以句点结束。