2013-05-12 3 views
4

J'ai créé mon premier projet Erlang. C'est un jeu de code secret simple. J'essaie d'éviter OTP à tout prix car il semble vraiment déroutant et mon mentor a pensé qu'il n'était pas nécessaire de l'utiliser pour cette remise des gaz.Comment installer meck avec mon projet Erlang?

J'ai trois dossiers: Ebin src essai

J'utilise un makefile pour compiler tout le code et des tests.

La vie est bonne jusqu'à ce soir ...

Pour se moquer de mon entrée (et les sorties?) Pour le jeu, il a été recommandé que j'utilise Meck, mais je vais avoir une période très difficile l'intégrer dans mon projet.

J'ai essayé d'installer manuellement. J'ai fait un clone git de Meck. Je peux "cd" dans le dossier eBin dans le répertoire Meck et compiler, exécuter tous les tests du système, et exécuter une commande de base "meck: new (dog)". Impressionnant!

Maintenant, j'ai besoin que Meck travaille avec mon projet ... J'ai lu cette ligne dans le readme de Github Meck: "Si vous voulez installer votre propre version de meck, ajoutez le répertoire ebin à votre chemin de code Erlang ou déplacez le dossier meck dans votre dossier de version et assurez-vous que ce dossier se trouve dans votre variable d'environnement ERL_LIBS. "

Mais je ne peux pas comprendre comment ajouter le répertoire ebin à mon chemin de code Erland, je n'ai pas de dossier de version (c'est une chose de rebar je pense?) Et je ne sais pas comment ajouter une variable d'environnement ERL_LIBS. Donc je suis coincé.

Voici ce que j'ai essayé: Pour ajouter le répertoire ebin à mon chemin de code, je l'ai fait dans mon makefile (je le répertoire meck assis sur mon bureau en ce moment):

erlc -pa ~/Desktop/meck/ebin/ 

Et J'ai ajouté le ERL_LIBS à mes .bash_profile comme ceci:

export ERL_LIBS='~/Desktop/meck/ebin/' 

J'ai aussi essayé d'installer Agner et des erreurs quand installer:

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 

Quelqu'un peut-il aider? Je me sens comme il y avait plusieurs options pour moi d'essayer et aucun d'entre eux ne fonctionne.

Mise à jour:

Voici ce que mon fichier make ressemble après avoir lu @ solution de 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 

Mise à jour finale:

Sur la base des conseils, voici ma dernière makefile qui fonctionne maintenant.

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 

Répondre

3

Mettez simplement meck (et tous ses sous-répertoires) dans un sous-répertoire de votre projet; disons, deps /.

Alors maintenant, vous aurez:

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

Parce que libs dans Erlang sont conditionnés de la même façon que les applications, il y a l'environnement ERL_LIBS variable qui dira la machine virtuelle où trouver les bibliothèques de votre application utilise. Meck est l'une de ces libs, et c'est sur le chemin "deps /".

erl -pa ebin/ -env ERL_LIBS deps/ 

Maintenant meck devrait être visible par la machine virtuelle Erlang.

+0

Merci beaucoup pour votre aide! J'ai ajouté le dossier deps/meck et ajouté la ligne ERL_LIBS à mon makefile. Je pense que je dois encore ajouter quelque chose à ma ligne MODS ci-dessus? Il y a 4 fichiers dans le dossier src: meck.app.src, meck.erl, meck_abstract.hrl et meck_mod.erl. Est-ce que je les ajoute à la ligne MODS? En outre, lorsque je l'exécute actuellement, j'obtiens cette erreur: env: ERL_LIBS: Aucun fichier ou répertoire make: [path] Erreur 127 (ignoré) – Kelly

+0

Ne confondez pas 'erlc' avec' erl'. L'indicateur '-env' est utilisé par la machine virtuelle Erlang, mais pas par le compilateur. Les libs n'ont pas besoin d'être liés au moment de la compilation, donc même si votre code référence des modules qui n'existent pas, le compilateur ne vous en parlera pas. Vous découvrirez à l'exécution. Maintenant, puisque vous utilisez des barres d'armature, pourquoi ne pas simplement installer meck en l'ajoutant à votre rebar.config et en utilisant 'rebar get-deps' et' rebar compile'? https://github.com/basho/rebar/wiki/Dependency-management. – d11wtq

+0

Merci beaucoup pour le conseil sur erl vs. erlc! Je me suis rendu compte après avoir lu votre note que je ne savais vraiment pas ce que faisaient ces lignes dans mon makefile. Je suis retourné lire la documentation et cette fois j'ai compris la documentation beaucoup plus facilement après avoir lu vos conseils ci-dessus. J'ai inséré ma question avec une version finale de mon makefile qui fonctionne maintenant avec meck. Merci encore! (De plus, j'essayais d'éviter les barres d'armature à ce stade du jeu. Je suis encore en train d'apprendre Erlang et mon devoir est dû demain, donc je n'étais pas prêt à apprendre les barres d'armature.) – Kelly

2

meck's README Citation:

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"}} 
]}. 

Et puis exécutez rebar get-deps et rebar compile.

+0

. Merci pour ça. Quand mon mentor quand lancer le jeu, ça ne marcherait pas parce que nous n'avions pas cette configuration. Merci d'avoir partagé!! – Kelly