为什么钢筋使用我的erl_opts来编译我的deps?

时间:2013-12-09 08:09:01

标签: erlang rebar

我的结构类似于以下内容:

rebar.config
deps/
apps/A/rebar.config

我的顶级rebar.config文件如下所示:

{sub_dirs, ["apps/A"]}.
{lib_dirs, ["deps"]}.

A/rebar.config如下所示:

{deps, [
    %% deps
    ]}.

{erl_opts, [debug_info, warn_missing_spec, warnings_as_errors]}.

现在,我的一个依赖项没有为其所有函数提供-spec,因此warnings_as_errors会导致编译失败。

我希望erl_opts只影响我的代码,并且依赖项有自己的选项。为什么rebar会这样做?

2 个答案:

答案 0 :(得分:2)

事实证明我的一个依赖项没有rebar.config,所以rebar正在使用我的选项编译它。

令人困惑的是erl_opts未在顶级rebar.config中设置,而是在本地rebar.config文件中设置。这是具有deps子句的文件。

在这种情况下,选项似乎是“横向”继承的。

答案 1 :(得分:1)

我无法使用以下版本的钢筋重现这一点:

rebar 2.1.0-pre R15B03 20131210_073701 git 2.1.0-pre

在我的本地设置中,使用相同的配置( goldrush 是我的依赖):

...
==> goldrush (compile)
DEBUG: Matched required ERTS version: 5.9.3.1 -> .*
DEBUG: Matched required OTP release: R15B03 -> .*
DEBUG: Min OTP version unconfigured
DEBUG: erl_opts [debug_info,warn_export_all]
...
==> myapp (compile)
DEBUG: Matched required ERTS version: 5.9.3.1 -> .*
DEBUG: Matched required OTP release: R15B03 -> .*
DEBUG: Min OTP version unconfigured
DEBUG: erl_opts [debug_info,debug_info,warn_missing_spec,warnings_as_errors]
...

如您所见,这两个应用程序会收到两组不同的选项。

你能启用调试并发布相关输出吗?

./rebar -vvv clean compile

你在运行什么版本的rebar / Erlang?