2014-08-27 159 views
4

我决定在我的Erlang项目中安装lager。我使用erlang.mk,所以我添加了在通用测试测试运行期间Lager调用失败

ERLC_OPTS = +'{parse_transform, lager_transform}' 

到我的Makefile。我可以运行make all并编译模块没有错误。我也可以启动一个erl控制台并使用lager运行包含模块的应用程序。在控制台会话期间,不会生成错误并记录日志消息。似乎一切都很好(这是我第一次使用啤酒)。但是,当我运行常用的测试中,啤酒调用失败:

10:11:17.174 [error] CRASH REPORT Process <0.238.0> with 2 neighbours exited with reason: call to undefined function lager:info("Params: ~p", [[]]) in gen_server:init_it/6 line 328

因为它看起来好像我测试的模块已经正确编译,我认为这是不存在的啤酒模块的问题。不过,如果我补充一点:

erlang:display(lager:module_info()), 

第一啤酒上面称之为成功,为印刷啤酒模块信息。我假设我正在做的日志记录调用正在使用一些解析变换魔术以便工作,而这在我的通用测试运行期间不存在。

任何建议,非常感谢!

+0

解决了!这是由于我的Makefile(不是erlang.mk)中的错误。当我得到片刻时,我会添加一个答案。 – Stratus3D 2014-08-27 19:09:38

回答

3

原来我在Makefile中有一个错误,但我在这个过程中学到了很多关于erlang.mk的知识。 erlang.mk正在寻找一个名称不同的变量。

我本来这在我的Makefile:

ERLC_OPTS = +'{parse_transform, lager_transform}' 

但erlang.mk不使用ERLC_OPTS测试之前编译模块。它总是在通用测试套件之前重新编译。为了让这些模块进行编译的,我需要做此分析变换来进行测试:

# Compile flags 
ERLC_COMPILE_OPTS= +'{parse_transform, lager_transform}' 

# Use the same settings for compiling releases as well as for testing 
ERLC_OPTS= $(ERLC_COMPILE_OPTS) 
TEST_ERLC_OPTS= $(ERLC_COMPILE_OPTS) 

这可以确保应用程序的源代码在测试过程中使用完全相同的设置编译。

+1

我注意到,在'include erlang.mk'这一行之前,在Makefile中像这样设置ERLC_OPTS会影响erlang.mk本身的ERLC_OPTS设置,因为它看起来像这样:ERLC_OPTS?= ... – postfuturist 2014-10-22 20:28:14

3

这Stratus3D答案不影erlang.mk对ERLC_OPTS和TEST_ERLC_OPTS值略有改革,但增加了对他们说:

# this must be first 
include erlang.mk 

# Compile flags 
ERLC_COMPILE_OPTS= +'{parse_transform, lager_transform}' 

# Append these settings 
ERLC_OPTS += $(ERLC_COMPILE_OPTS) 
TEST_ERLC_OPTS += $(ERLC_COMPILE_OPTS) 
相关问题