2013-05-12 2 views
4

Я создал свой первый проект 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 

ответ

3

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

Итак, теперь вы будете иметь:

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

Поскольку ЛИЭС в Erlang будут упакованы так же, как приложений, есть переменная окружения ERL_LIBS, что будет говорить VM, где найти библиотеки ваше приложение использует. Мек является одним из этих библиотек, и он находится по пути «deps /».

erl -pa ebin/ -env ERL_LIBS deps/ 

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

+0

Большое вам спасибо за помощь! Я добавил папку 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

+0

Не путайте 'erlc' с' erl'. Флаг '-env' используется виртуальной машиной Erlang, но не компилятором. Лицам не нужно подключаться во время компиляции, поэтому даже если ваш код ссылается на модули, которых не существует, компилятор не расскажет вам об этом. Вы узнаете во время работы. Теперь, поскольку вы используете арматуру, почему бы вам просто не установить meck, добавив ее в свой rebar.config и используя 'rebar get-deps' и' rebar compile'? https://github.com/basho/rebar/wiki/Dependency-management. – d11wtq

+0

Большое спасибо за отзыв о erl vs. erlc! Я понял, прочитав вашу заметку, что я действительно не знал, что делают эти строки в моем make-файле. Я вернулся и прочитал документацию, и на этот раз я понял документацию намного легче после прочтения ваших советов выше. Я обдумал свой вопрос с окончательной версией моего файла makefile, который теперь работает с meck. Еще раз спасибо! (Кроме того, я пытался избежать арматуры на этом этапе игры. Я все еще просто изучаю Эрланг, и мое задание ожидается завтра, поэтому я не был готов начать изучение арматуры.) – Kelly

2

Цитирование meck's README:

Meck is best used via rebar. Add the following dependency t your rebar.config in your project root:

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

А затем запустить rebar get-deps и rebar compile.

+0

Вы были совершенно правы в этом вопросе , Спасибо вам за это. Когда мой наставник когда запускал игру, это не сработало, потому что у нас не было этой настройки. Спасибо, что поделился!! – Kelly

Смежные вопросы