配置脚本

使用 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/2file:consult/1 不同,因为它只返回最后一个表达式的结果。因此,您必须注意返回配置项列表。在此之前,您可以进行任何形式的 I/O 操作(包括网络操作),检查操作系统环境变量,读取文件(可能在其他文件上调用 file:script/2)或写入文件。您基本上可以使用所有 OTP 库。与 file:eval/2 一样,每个表达式都以句点结束。