使用rebar构建Erlang project的时候,通过设置rebar.config可以为rebar配置各种选项。

其中比较常用的有 erl_opts 这个选项。

{erl_opts, [smp, debug_info, {d, 'APP', myproject}, {d, debug}]}.

实际上它是设置Erlang Compiler的参数。

见 http://www.erlang.org/doc/man/compile.html

平时我们可以在每个 .erl 文件的头部写上这种语句

-compile({no_auto_import,[error/1]}).

来告诉编译器编译本文件时用到的编译选项。

如果把这些参数放在rebar.config里面设置的话,就可以对所有文件使用同一套编译参数了。

比如在rebar.config里面:

{erl_opts, [smp, debug_info, nowarn_unused_function]}.

这里设置了nowarn_unused_function,即module中有未被使用的function时不触发警告。

效果等同于在每个module文件中加入这句

-compile(nowarn_unused_function).

 

有如下情景,使用rebar.config来配置全局编译参数时会比较方便:

在开发和调试阶段,可能有需要在console打印一些调试信息,通常会用到io:format. 但是发布的程序,在正式环境下是不需要打印这些东西的。

那么我们可以这样做。

在rebar.config设置erl_opts, 定义一个Macro, {d, debug}, 表示调试模式。

{erl_opts, [smp, no_debug_info, {d, debug}]}.

然后在一个全局的hrl文件中定义输出调试信息的Macro

-ifdef(debug).
-define(TRACE(Str), io:format(Str)).
-define(TRACE(Str, Args), io:format(Str, Args)).
-else.
-define(TRACE(Str), void).
-define(TRACE(Str, Args), void).
-endif.

这样,我们在需要打印调试信息的地方用

TRACE("something to show") 而不是直接用 io:format.

 

好处是, 当发布正式版本时, 只须要把rebar.config里面的{d, debug}去掉而不用改动代码,就可以不打印调试信息了。