Как мне установить 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
,