Как мне установить meck с моим проектом Erlang?

Я создал свой первый проект Erlang. Это простая игра с секретным кодом. Я пытаюсь избежать OTP любой ценой, потому что он кажется ДЕЙСТВИТЕЛЬНО сбивающим с толку, и мой наставник подумал, что нет необходимости использовать его на этом этапе.

У меня есть три папки: ebin src test

Я использую make-файл для компиляции всего кода и запуска тестов.

Жизнь хороша до вечера...

Чтобы смоделировать мои входные данные (и выходные данные?) Для игры, было рекомендовано использовать Meck, но мне очень трудно интегрировать его в свой проект.

Я пытался вручную установить. Я сделал мерзкий клон Мека. Я могу "cd" в папку eBin в каталоге Meck и скомпилировать, запустить все системные тесты и выполнить базовую команду "meck:new(dog)". Потрясающие!

Теперь мне нужно, чтобы Meck работал с моим проектом... Я прочитал эту строку в readme Github Meck: "Если вы хотите установить собственную встроенную версию meck, добавьте каталог ebin в путь к коду Erlang или переместите папку meck в свою папку выпуска и убедитесь, что эта папка находится в переменной среды ERL_LIBS."

Но я не могу понять, как добавить каталог ebin в мой путь к коду Erland, у меня нет папки с выпуском (я думаю, что это штука с арматурой) и я не знаю, как добавить переменную среды ERL_LIBS, Так что я застрял.

Вот что я попробовал: чтобы добавить каталог ebin в мой путь к коду, я сделал это в своем make-файле (сейчас у меня на рабочем столе находится каталог 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

Кто-нибудь может помочь? Я чувствую, что у меня было несколько вариантов, и ни один из них не работает.

Обновить:

Вот как выглядит мой make-файл после прочтения решения @d11wtq:

    .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

Окончательное обновление:

Основываясь на советах, вот мой последний make-файл, который теперь работает.

    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

2 ответа

Решение

Просто поместите meck (и все его подкаталоги) в подкаталог вашего проекта; скажем, deps/.

Так что теперь у вас будет:

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

Поскольку библиотеки в Erlang упакованы так же, как и приложения, существует переменная среды ERL_LIBS, которая сообщит виртуальной машине, где искать библиотеки, используемые вашим приложением. Мекк - одна из тех библиотек, и она находится на пути "deps/".

erl -pa ebin/ -env ERL_LIBS deps/

Теперь meck должен быть виден для Erlang VM.

Цитируя Мека README:

Мек лучше всего использовать через арматуру. Добавьте следующую зависимость к вашему rebar.config в корне вашего проекта:

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

А потом беги rebar get-deps а также rebar compile,

Другие вопросы по тегам