我决定在我的Erlang项目中设置lager。我正在使用erlang.mk,所以我添加了
ERLC_OPTS = +'{parse_transform, lager_transform}'
到我的Makefile。我可以运行make all
并编译模块而不会出错。我也可以启动erl
控制台并使用lager运行包含模块的应用程序。在控制台会话期间不会生成错误并且会记录日志消息。似乎一切都很好(这是我第一次使用啤酒)。但是,当我运行Common Test时,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()),
在第一个lager上面调用它成功,打印模块信息为lager。我假设我正在进行的日志记录调用正在使用一些解析变换魔法来工作,这在我的Common Test运行期间不存在。
非常感谢任何建议!
答案 0 :(得分:3)
原来我在Makefile中有一个误导,但我在这个过程中学到了很多关于erlang.mk的知识。 erlang.mk正在寻找一个名称不同的变量。
我最初是在我的Makefile中:
ERLC_OPTS = +'{parse_transform, lager_transform}'
但是erlang.mk在测试模块之前不会使用ERLC_OPTS来编译模块。它总是在Common Test套件之前重新编译。为了让模块使用parse转换进行编译以进行测试,我需要这样做:
# 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 :(得分: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)