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

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

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

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

Жизнь удалась до вечера...

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

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

Теперь мне нужно, чтобы Meck работал с моим проектом... Я прочитал эту строку в ридми 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

person Kelly    schedule 12.05.2013    source источник


Ответы (2)


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

Итак, теперь у вас будет:

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

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

erl -pa ebin/ -env ERL_LIBS deps/

Теперь meck должен быть виден виртуальной машине Erlang.

person d11wtq    schedule 12.05.2013
comment
Большое вам спасибо за вашу помощь! Я добавил папку deps/meck и добавил строку ERL_LIBS в свой make-файл. Я думаю, что мне все еще нужно добавить что-то в мою строку MODS выше? В папке src есть 4 файла: meck.app.src, meck.erl, meck_abstract.hrl и meck_mod.erl. Добавлю ли я их в линейку MODS? Кроме того, когда я запускаю это сейчас, я получаю эту ошибку: env: ERL_LIBS: Нет такого файла или каталога: [путь] Ошибка 127 (игнорируется) - person Kelly; 12.05.2013
comment
Не путайте erlc с erl. Флаг -env используется виртуальной машиной Erlang, но не компилятором. Библиотеки не нужно связывать во время компиляции, поэтому даже если ваш код ссылается на несуществующие модули, компилятор не сообщит вам об этом. Вы узнаете во время выполнения. Теперь, поскольку вы используете арматуру, почему бы вам просто не установить meck, добавив ее в свой файл rebar.config и используя rebar get-deps и rebar compile? github.com/basho/rebar/wiki/Dependency-management. - person d11wtq; 12.05.2013
comment
Большое спасибо за совет по erl vs. erlc! Прочитав вашу заметку, я понял, что действительно не знал, что делают эти строки в моем make-файле. Я вернулся и прочитал документацию, и на этот раз я понял документацию намного легче после прочтения ваших советов выше. Я обновил свой вопрос окончательной версией моего make-файла, который теперь работает с meck. Еще раз спасибо! (Кроме того, на этом этапе игры я пытался избегать использования арматуры. Я только изучаю Erlang, и мое задание должно быть выполнено завтра, поэтому я не был готов начать изучать арматуру.) - person Kelly; 12.05.2013

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

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

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

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

person legoscia    schedule 12.05.2013
comment
Вы были совершенно правы насчет этого. Спасибо за это. Когда мой наставник запускал игру, она не работала, потому что у нас не было этой настройки. Спасибо, что поделился!! - person Kelly; 15.05.2013