如何在Erlang项目中安装meck?

如何在Erlang项目中安装meck?,erlang,otp,meck,Erlang,Otp,Meck,我创建了我的第一个Erlang项目。这是一个简单的密码游戏。我试图不惜一切代价避免OTP,因为它看起来真的很混乱,我的导师认为这次没有必要使用它 我有三个文件夹: 息税前利润 src 试验 我使用makefile编译所有代码并运行测试 直到今晚,生活都很美好 为了模拟我在游戏中的输入(和输出?),有人建议我使用Meck,但我很难将它集成到我的项目中 我尝试手动安装。我做了Meck的git克隆。我可以“cd”到Meck目录中的eBin文件夹中,编译、运行所有系统测试,并执行基本命令“Meck:ne

我创建了我的第一个Erlang项目。这是一个简单的密码游戏。我试图不惜一切代价避免OTP,因为它看起来真的很混乱,我的导师认为这次没有必要使用它

我有三个文件夹: 息税前利润 src 试验

我使用makefile编译所有代码并运行测试

直到今晚,生活都很美好

为了模拟我在游戏中的输入(和输出?),有人建议我使用Meck,但我很难将它集成到我的项目中

我尝试手动安装。我做了Meck的git克隆。我可以“cd”到Meck目录中的eBin文件夹中,编译、运行所有系统测试,并执行基本命令“Meck:new(dog)”。太棒了

现在我需要让Meck处理我的项目…我在Github Meck自述中读到这一行: “如果要安装自己的内置版本的meck,请将ebin目录添加到您的Erlang代码路径中,或将meck文件夹移动到发布文件夹中,并确保该文件夹位于ERL_LIBS环境变量中。”

但是我不知道如何将ebin目录添加到我的Erland代码路径中,我没有发布文件夹(我认为这是一个rebar的东西?),而且我不知道如何添加ERL_LIBS环境变量。所以我被卡住了

以下是我尝试过的: 为了将ebin目录添加到我的代码路径中,我在makefile中这样做了(我的桌面上现在有meck目录):

我将ERL_LIBS添加到我的.bash_配置文件中,如下所示:

    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
只需将meck(及其所有子目录)放在项目的子目录中;比如,deps/

因此,现在您将有:

src/
ebin/
deps/
  meck/
    src/
    ebin/
由于Erlang中的lib与应用程序的打包方式相同,因此存在环境变量ERL_libs,它将告诉VM在哪里可以找到应用程序使用的库。Meck是这些LIB中的一个,它位于路径“deps/”处

现在,Erlang VM应该可以看到meck了。

引用:

Meck最好通过钢筋使用。添加以下依赖项t 项目根目录中的
rebar.config

{deps, [
    {meck, ".*", {git, "https://github.com/eproxus/meck.git"}}
]}.

然后运行
rebar get deps
rebar compile

非常感谢您的帮助!我添加了deps/meck文件夹,并将ERL_LIBS行添加到我的makefile中。我想我还需要在上面的MODS行中添加一些东西?src文件夹中有4个文件:meck.app.src、meck.erl、meck_abstract.hrl和meck_mod.erl。我是否将这些添加到MODS行?另外,当我当前运行此命令时,我得到以下错误:env:ERL_LIBS:No这样的文件或目录make:[path]错误127(已忽略)不要将
erlc
ERL
混淆。Erlang VM使用
-env
标志,但编译器不使用。lib不需要在编译时链接,因此即使代码引用了不存在的模块,编译器也不会告诉您。您将在运行时发现。现在,既然您使用的是钢筋,为什么不将meck添加到您的rebar.config并使用
rebar get deps
rebar compile
?来安装它呢。非常感谢您提供关于erl vs.erlc的提示!读了你的笔记后,我意识到我真的不知道我的makefile中的那些行在做什么。我回去阅读了文档,这次在阅读了上面的提示之后,我更容易理解文档。我用我的makefile的最终版本提出了我的问题,该版本现在可以与meck一起使用。再次感谢!(另外,在游戏的这个阶段,我试图避开力霸。我还在学习Erlang,我的作业明天就要交了,所以我还没有准备好开始学习力霸。)你完全正确。谢谢你。当我的导师决定何时运行游戏时,它不会起作用,因为我们没有这个设置。谢谢分享!!
src/
ebin/
deps/
  meck/
    src/
    ebin/
erl -pa ebin/ -env ERL_LIBS deps/
{deps, [
    {meck, ".*", {git, "https://github.com/eproxus/meck.git"}}
]}.