Я создал свой первый проект Erlang. Это простая игра с секретным кодом. Я стараюсь избегать OTP любой ценой, потому что кажется ДЕЙСТВИТЕЛЬНО запутанным, и мой наставник подумал, что нет необходимости использовать его в этом направлении.Как установить meck с моим проектом Erlang?
У меня есть три папки: Эбин ЦСИ тест
Я использую Makefile компилировать весь код и запускать тесты.
Жизнь хороша до сегодняшнего вечера ...
издеваться мой вход (и выходы?) Для игры, было рекомендовано, чтобы я использую Мекк, но я действительно трудное время интеграции его в свой проект.
Я попытался установить вручную. Я сделал гет-клон Мек. Я могу «cd» в папку eBin в каталоге Meck и компилировать, запускать все системные тесты и выполнять базовую команду «meck: new (dog)». Потрясающие!
Теперь мне нужно, чтобы Мек работал с моим проектом ... Я прочитал эту строку в Github Meck readme: «Если вы хотите установить свою собственную встроенную версию meck, добавьте каталог ebin в свой путь кода Erlang или переместите папку meck в папку выпуска и убедитесь, что папка находится в переменной окружения ERL_LIBS. "
Но я не могу понять, как добавить ebin-каталог в мой путь к коду Erland, у меня нет папки для релиза (это я думаю, что это арматура), и я не знаю, как добавить переменная среды ERL_LIBS. Поэтому я застрял.
Вот что я пытался: Чтобы добавить каталог Эбин в мой код пути, я сделал это в моем Makefile (я имею Мекк каталог, сидя на моем рабочем столе прямо сейчас):
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
Может ли кто-нибудь помочь? Я чувствую, что для меня было несколько вариантов, и никто из них не работает.
Update:
Вот что мой макияж файл выглядит после прочтения @ решения 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
Final Update:
Основываясь на кончиках, вот мой последний 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
Большое вам спасибо за помощь! Я добавил папку deps/meck и добавил строку ERL_LIBS в свой файл makefile. Думаю, мне еще нужно добавить что-то в мою линию MODS выше? В папке src есть 4 файла: meck.app.src, meck.erl, meck_abstract.hrl и meck_mod.erl. Я добавляю их в строку MODS? Кроме того, когда я запускаю это в настоящее время, я получаю эту ошибку: env: ERL_LIBS: Нет такого файла или каталога make: [path] Ошибка 127 (игнорируется) – Kelly
Не путайте 'erlc' с' erl'. Флаг '-env' используется виртуальной машиной Erlang, но не компилятором. Лицам не нужно подключаться во время компиляции, поэтому даже если ваш код ссылается на модули, которых не существует, компилятор не расскажет вам об этом. Вы узнаете во время работы. Теперь, поскольку вы используете арматуру, почему бы вам просто не установить meck, добавив ее в свой rebar.config и используя 'rebar get-deps' и' rebar compile'? https://github.com/basho/rebar/wiki/Dependency-management. – d11wtq
Большое спасибо за отзыв о erl vs. erlc! Я понял, прочитав вашу заметку, что я действительно не знал, что делают эти строки в моем make-файле. Я вернулся и прочитал документацию, и на этот раз я понял документацию намного легче после прочтения ваших советов выше. Я обдумал свой вопрос с окончательной версией моего файла makefile, который теперь работает с meck. Еще раз спасибо! (Кроме того, я пытался избежать арматуры на этом этапе игры. Я все еще просто изучаю Эрланг, и мое задание ожидается завтра, поэтому я не был готов начать изучение арматуры.) – Kelly