我创建了我的第一个Erlang项目。这是一个简单的密码游戏。我试图不惜一切代价避免使用OTP,因为它似乎真的令人困惑,我的导师认为没有必要使用它来解决这个问题。
我有三个文件夹: EBIN SRC 测试
我使用makefile编译所有代码并运行测试。
直到今晚,人生才好......
为了模拟游戏的输入(和输出?),建议我使用Meck,但我很难将它集成到我的项目中。
我尝试手动安装。我做了Meck的git克隆。我可以“cd”到Meck目录中的eBin文件夹并编译,运行所有系统测试,并执行基本命令“meck:new(dog)”。真棒!
现在我需要让Meck使用我的项目......我在Github Meck自述文件中读到了这一行: “如果你想安装自己内置的meck版本,请将ebin目录添加到你的Erlang代码路径中,或者将meck文件夹移动到你的发行文件夹中,并确保该文件夹在你的ERL_LIBS环境变量中。”
但是我无法弄清楚如何将ebin目录添加到我的Erland代码路径中,我没有发布文件夹(我认为这是一个螺纹钢的东西?)而且我不知道如何添加一个ERL_LIBS环境变量。所以我被卡住了。
这是我尝试过的: 要将ebin目录添加到我的代码路径中,我在makefile中执行了此操作(我的mek目录现在位于我的桌面上):
erlc -pa ~/Desktop/meck/ebin/
我将ERL_LIBS添加到我的.bash_profile中,如下所示:
export ERL_LIBS='~/Desktop/meck/ebin/'
我还尝试安装Agner并在安装时遇到错误:
ERROR: compile failed while processing /private/tmp/agner.0r04Vm: {'EXIT',
{undef,
[{rebar,get_jobs,
[{config,"/private/tmp/agner.0r04Vm",
[{require_otp_vsn,"R14|R15"},
{lib_dirs,["deps"]},
{escript_incl_apps,
[getopt,gproc,rebar,plists,gen_fsm2,jsx]},
{erl_opts,[{i,"deps"}]},
{plugins,[agner_rebar_plugin]},
local]}],
[]},
{rebar_base_compiler,run,4,
[{file,"src/rebar_base_compiler.erl"},{line,49}]},
{rebar_erlc_compiler,doterl_compile,3,
[{file,"src/rebar_erlc_compiler.erl"},{line,157}]},
{rebar_core,run_modules,4,[{file,"src/rebar_core.erl"},{line,420}]},
{rebar_core,execute,4,[{file,"src/rebar_core.erl"},{line,354}]},
{rebar_core,process_dir0,6,[{file,"src/rebar_core.erl"},{line,217}]},
{rebar_core,process_dir,4,[{file,"src/rebar_core.erl"},{line,128}]},
{rebar_core,process_commands,2,
[{file,"src/rebar_core.erl"},{line,83}]}]}}
make: *** [compile] Error 1
有人可以帮忙吗?我觉得我有几个选择尝试,但没有一个可以工作。
更新
在阅读@ d11wtq的解决方案之后,这是我的make文件的样子:
.SUFFIXES: .erl .beam .yrl
.erl.beam:
erlc -W $<
.yrl.erl:
erlc -W $<
ERL = erl -boot start_clean
MODS = console_io feedback mastermind secret_code meck
all: compile path run_test
compile:
erlc -o ebin/ src/*.erl
erlc -o ebin/ test/*.erl
path:
erlc -pa ebin/
-env ERL_LIBS deps/
run_test:
erl -noshell -pa ebin \
-eval 'eunit:test("ebin").' \
-eval 'mastermind:start_game().' \
-s init stop
clean:
rm -rf ebin/*.beam
rm -rf erl_crash.dump
最终更新:
根据提示,这是我现在可以使用的最终makefile。
all: compile run_test run_game
compile:
erlc -o ebin/ src/*.erl
erlc -o ebin/ test/*.erl
run_test:
erl -pa ebin \
-env ERL_LIBS deps/ \
-eval 'eunit:test("ebin").' \
-s init stop
run_game:
erl -pa ebin \
-env ERL_LIBS deps/ \
-eval "mastermind:start_game()." \
-s init stop
clean:
rm -rf ebin/*.beam
rm -rf erl_crash.dump
答案 0 :(得分:3)
将meck(及其所有子目录)放在项目的子目录中;比如,deps /.
所以现在你将拥有:
src/
ebin/
deps/
meck/
src/
ebin/
由于Erlang中的libs与应用程序的打包方式相同,因此环境变量ERL_LIBS将告诉VM在哪里可以找到应用程序使用的库。 Meck是其中一个库,它位于“deps /".
的路径上erl -pa ebin/ -env ERL_LIBS deps/
现在meck应该对Erlang VM可见。
答案 1 :(得分:2)
Meck最好通过螺纹钢使用。添加以下依赖项t 项目根目录中的
rebar.config
:{deps, [ {meck, ".*", {git, "https://github.com/eproxus/meck.git"}} ]}.
然后运行rebar get-deps
和rebar compile
。