2013-05-21 12 views
11

Sono nuovo nel mondo di Erlang e attualmente non riesco a capire come avviare la mia applicazione fittizia di erlang. Probabilmente mi manca qualcosa ... Così, ho creato un'applicazione con rebar (rebar create-app appid = dummys).Come eseguire l'applicazione erlang (rebar build)

Attualmente ho

  • rebar.config
  • src/dummys.app.src
  • src/dummys_app.erl
  • src/dummys_sup.erl

ho trovato che per eseguire un'applicazione durante uno sviluppo è meglio creare un metodo di avvio aggiuntivo che dovrebbe chiamare l'applicazione: start (modulo).

ho aggiunto un po 'di registrazione di base per i miei metodi di avvio ..

start() -> 
    error_logger:info_msg("Starting app(dev)..~n"), 
    application:start(dummys_app). 

start(_StartType, _StartArgs) -> 
    error_logger:info_msg("Starting app..~n"), 
    dummys_sup:start_link(). 

Se provo

erl -noshell -pa ebin -s application start dummys 
erl -noshell -pa ebin -s application start dummys_app 

non ci sono uscita ..

Se provo

erl -noshell -pa ebin -s dummys start 

erl si blocca con un erro r ..

se provo

erl -noshell -pa ebin -s dummys_app start 

emette solo "app Avvio (dev) .." e questo è tutto. Ma mi aspetto anche di vedere "Avvio app .."

Cosa mi manca o sto facendo male ??

=============

E un'altra domanda: Come aggiungere un nuovo modulo per la mia applicazione manichino correttamente? Ad esempio, ho un modulo aggiuntivo chiamato "* dummys_cool *" che ha un metodo "start". Come dire alla mia applicazione di eseguire quel metodo "dummys_cool # start"?

Grazie!

risposta

12

Per lo sviluppo rapido, se si desidera solo per garantire la vostra appliction può iniziare, avviare una shell, quindi avviare l'applicazione:

erl -pa ebin 
1> dummys_app:start(). 

Che vi darà un'indicazione pulita di ciò che è giusto e sbagliato, senza la bombardamento di bombe dopo.

Dato che stai eseguendo un'applicazione da eseguire, piuttosto che una semplice libreria da condividere, ti consigliamo di fare un rilascio. Rebar si può ottenere la maggior parte del tragitto:

mkdir rel 
cd rel 
rebar create-node nodeid=dummysnode 

Dopo aver compilato l'applicazione, è possibile creare una versione:

rebar generate 

Questo creerà un rilascio portatile che include tutte le librerie necessarie e persino il sistema di runtime erlang. Questo è messo di default nella directory rel /; nel tuo caso rel/dummys.

All'interno di questa directory ci sarà uno script di controllo che è possibile utilizzare per avviare, arrestare e allegare alla domanda:

rel/dummys/bin/dummys start 
rel/dummys/bin/dummys stop 
rel/dummys/bin/dummys start 
rel/dummys/bin/dummys attach 
+0

Grazie per la spiegazione! Alla fine, ho capito come funziona tutto insieme. – cyrillk

+0

Questo è un consiglio solido. Sembra che la semantica sia cambiata un po 'con rebar3. La documentazione è ottima (https://www.rebar3.org/docs/releases). Verifica in particolare {dev_mode, true}. –

2

Dai un'occhiata al tuo file dummys.app.src. Il significato di tutte le direttive è spiegato in the 'app' manpage, ma quello che sospetto manchi qui è mod, che indica il nome del modulo di callback dell'applicazione. Quindi, assicurarsi che questa linea è presente:

{mod, {dummys_app, []}} 

La lista vuota in là verrà passato come il StartArgs argomento di dummys_app:start/2.


Per fare in modo che un nuovo modulo inizi con l'applicazione, aggiungerlo all'albero di supervisione in dummys_sup:init.Questa funzione dovrebbe essere simile:

init(_) -> 
    {ok, {{one_for_one, 10, 10}, 
     [{dummys_cool, {dummys_cool, start_link, []}, 
      permanent, brutal_kill, worker, [dummys_cool]}]}. 

Questo è descritto in the 'supervisor' manpage, ma in fondo questo significa che all'avvio, questo supervisore avviare uno processo figlio. dummys_cool:start_link() verrà chiamato e si prevede che tale funzione crei un nuovo processo, vi si colleghi e restituisca il suo id di processo. Se hai bisogno di più processi, aggiungi semplicemente altre specifiche figlio all'elenco.

+0

Grazie @legoscia. Ho controllato il mio file app.src e mod è lì '{applicazioni, dummys, [ {descrizione, "applicazione fittizio"}, { vsn, "1"}, { registrati, []}, {applicazioni, [ kernel, stdlib ]}, { mod, {dummys_app, []}}, { env, []} ]}. ' – cyrillk

1
erl -noshell -pa ebin -s application start dummys 

Il codice di cui sopra non funzionerà perché saranno chiamati application:start([dummys]).

È possibile prendere un riferimento allo Erlang documentation per i dettagli.

Per il vostro caso,

erl -noshell -pa ebin -s dummys 
Problemi correlati