5

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

我有三个文件夹: ebin src test

我使用 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 中执行了此操作(我的桌面上现在有 meck 目录):

    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

最终更新:

根据提示,这是我现在可以使用的最终生成文件。

    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
4

2 回答 2

4

只需将 meck(及其所有子目录)放在项目的子目录中即可;比如说,deps/。

所以现在你将拥有:

src/
ebin/
deps/
  meck/
    src/
    ebin/

因为 Erlang 中的库与应用程序的打包方式相同,所以环境变量 ERL_LIBS 将告诉 VM 在哪里可以找到应用程序使用的库。Meck 是这些库之一,它位于路径“deps/”中。

erl -pa ebin/ -env ERL_LIBS deps/

现在 meck 应该对 Erlang VM 可见。

于 2013-05-12T08:45:47.673 回答
3

引用meck 的自述文件

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

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

然后运行rebar get-depsrebar compile

于 2013-05-12T16:31:09.087 回答