2011-07-24 44 views
1

我想可以使用下面的宏在我的模块:用用户定义变量(使用螺纹钢)启动erlang?

-ifdef(debug). 

我的启动脚本看起来像下面这样:

#!/bin/sh 
PWD="$(pwd)" 
#NAME="$(basename $PWD)" 
erl -pa "$PWD/ebin" deps/*/ebin -boot start_sasl \ 
    -name [email protected] \ 
    -debug 1 \ 
    -s $NAME \ 
    +K true \ 
    +P 65536 

还有什么需要添加,使调试是在我的模块中定义的?我需要这是动态的,所以我不必修改部署到生产环境中的源代码。在每个dev/qa/prod环境中使用不同的启动脚本是好的,但修改源代码不是必需的。可以用-Ddebug来完成。然而,我使用螺纹钢,并不知道如何做到这一点。我试着加入以下我rebar.config:

{erl_opts, [{D, "debug"}]}.

这提供了以下错误:

{error, 
{1, 
    erl_parse, 
    "bad term"}} 

回答

1

IFDEF是预处理宏,它就会被评估并在编译时删除 - - 你将不得不重新编译你的模块,如erlc -Ddebug module.erl来改变它。如果要查看module.P中预处理器的输出,请添加“-P”标志。

要在运行时访问“-debug 1”参数,可以使用init:get_argument(debug)

# erl -debug 1 
... 
1> init:get_argument(debug). 
{ok,[["1"]]} 
2> init:get_argument(foo). 
error 
+0

那么如何处理生产部署?手动编辑模块以删除调试预处理器? – randombits

+0

用于生产,您可以编译时不带-Ddebug标志。无需编辑源代码。 – butter71

+0

我应该注意到,我正在使用钢筋进行编译。所以我没有明确的访问''erlc'' – randombits

3

的定义在rebar.config编译器应该是这样的:

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

注:语法是完全一样的,因为编译器模块的语法:http://www.erlang.org/doc/man/compile.html

当前的版本螺纹钢(rebar版本:2日期:20111205_155958 vcs:git 54259c5)也支持编译器定义。

rebar -D <defines> compile 

请参阅rebar --help了解更多螺纹钢选项。