5

初めての Erlang プロジェクトを作成しました。シンプルな暗証番号ゲームです。私はOTPを絶対に避けようとしています.OTPは本当に混乱しているように見えます.

3 つのフォルダーがあります: ebin src test

Makefile を使用してすべてのコードをコンパイルし、テストを実行します。

人生は今夜まで良いです...

ゲームの入力 (および出力?) を模擬するために、Meck を使用することをお勧めしましたが、プロジェクトに統合するのに非常に苦労しています。

手動でインストールしてみました。Meck の git clone を行いました。Meck ディレクトリの eBin フォルダに「cd」してコンパイルし、すべてのシステム テストを実行して、基本的なコマンド「meck:new(dog)」を実行します。素晴らしい!

今、私は自分のプロジェクトで Meck を動作させる必要があります... Github Meck の readme で次の行を読みました:リリース フォルダを作成し、そのフォルダが ERL_LIBS 環境変数にあることを確認してください。」

しかし、Erland のコード パスに ebin ディレクトリを追加する方法がわかりません。リリース フォルダーがなく (これは鉄則だと思いますか?)、ERL_LIBS 環境変数を追加する方法もわかりません。 . だから私は立ち往生しています。

私が試したことは次のとおりです: コード パスに ebin ディレクトリを追加するために、makefile でこれを行いました (現在、デスクトップに 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

誰でも助けることができますか?試してみるべきいくつかのオプションがあったように感じますが、どれも機能していません。

アップデート:

@d11wtqのソリューションを読んだ後の私のmakeファイルは次のようになります。

    .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

最終更新:

ヒントに基づいて、これが現在機能する最終的なメイクファイルです。

    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
4

2 に答える 2

4

プロジェクトのサブディレクトリに meck (およびそのすべてのサブディレクトリ) を配置するだけです。deps/ と言います。

これで、次のようになります。

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

Erlang のライブラリはアプリケーションと同じ方法でパッケージ化されるため、アプリケーションが使用するライブラリの場所を VM に伝える環境変数 ERL_LIBS があります。Meck はそれらのライブラリの 1 つで、パス "deps/" にあります。

erl -pa ebin/ -env ERL_LIBS deps/

これで、meck が Erlang VM に表示されるはずです。

于 2013-05-12T08:45:47.673 に答える
3

meck の README の引用:

メックは鉄筋を介して使用するのが最適です。rebar.configプロジェクト ルートに次の依存関係を追加します。

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

そして、実行rebar get-depsrebar compileます。

于 2013-05-12T16:31:09.087 に答える