2013-05-21 9 views
11

Jestem nowy w świecie Erlang i obecnie nie mogę się dowiedzieć, jak uruchomić moją aplikację Erlang Dummy. Prawdopodobnie coś mi brakuje ... Stworzyłem więc aplikację z prętem zbrojeniowym (rebar create-app appid = dummys).Jak uruchomić aplikację erlang (budować zbrojenie)

Obecnie mam

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

mam ustalono, że aby uruchomić aplikację podczas rozwoju lepiej jest stworzyć dodatkową metodę startu, która powinna wywoływać aplikację: start (moduł).

dodałem kilka podstawowych metod logowania do moich początkowych ..

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(). 

Gdy próbuję

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

nie ma wyjścia ..

Gdy próbuję

erl -noshell -pa ebin -s dummys start 

erl awarii z erro r ..

Gdy próbuję

erl -noshell -pa ebin -s dummys_app start 

wyprowadza tylko "Uruchamianie aplikacji (dev) .." i to wszystko. Ale spodziewam się również zobaczyć "Uruchomienie aplikacji .."

Czego mi brakuje lub robię źle?

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

I kolejne pytanie: Jak dodać nowy moduł do mojego manekina aplikacji poprawnie? Na przykład mam dodatkowy moduł o nazwie "* dummys_cool *", który ma metodę "start". Jak powiedzieć mojej aplikacji, aby uruchomić tę metodę "dummys_cool # start"?

Dziękujemy!

Odpowiedz

12

Do szybkiego rozwoju, jeśli tylko chcą, aby zapewnić appliction można uruchomić, uruchom powłokę, a następnie uruchomić aplikację:

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

który daje czystą wskazówkę co jest nie tak i prawo bez powłoka po bombardowaniu.

Ponieważ tworzysz aplikację do uruchomienia, a nie tylko bibliotekę do udostępnienia, będziesz chciał wydać wersję. Zbrojenie może Ci większość drogi tam:

mkdir rel 
cd rel 
rebar create-node nodeid=dummysnode 

Po skompilowany aplikacji można stworzyć wydanie:

rebar generate 

To zbuduje przenośną uwalniania, która zawiera wszystkie wymagane biblioteki a nawet system runtime erlang. Jest to domyślnie ustawione w katalogu rel /; w twoim przypadku rel/dummys.

Wewnątrz tego katalogu nie będzie skrypt sterujący, który można użyć, aby uruchomić, zatrzymać i dołączyć do wniosku:

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

Dziękuję za wyjaśnienie! W końcu zorientowałem się, jak to wszystko działa razem. – cyrillk

+0

To jest solidna rada. Wygląda na to, że semantyka zmieniła się nieco z prętem zbrojeniowym3. Dokumentacja jest świetna (https://www.rebar3.org/docs/releases). W szczególności sprawdź {dev_mode, true}. –

2

Spójrz na swój plik dummys.app.src. Znaczenie wszystkich dyrektyw wyjaśniono w the 'app' manpage, ale brakuje tu jednego, który, jak podejrzewam, jest mod, który wskazuje nazwę twojego modułu wywołania zwrotnego aplikacji. Więc upewnij się, że ta linia jest obecna:

{mod, {dummys_app, []}} 

Pusta lista tam będą przekazywane jako StartArgs argument dummys_app:start/2.


Aby uruchomić nowy moduł wraz z aplikacją, należy dodać go do drzewa nadzoru w numerze dummys_sup:init.Funkcja ta powinna wyglądać mniej więcej tak:

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

ten jest opisany w the 'supervisor' manpage, ale w zasadzie oznacza to, że na starcie, to przełożony zacznie jeden proces potomny. dummys_cool:start_link() zostanie wywołany, a funkcja ta ma odegrać nowy proces, połączyć się z nim i zwrócić jego identyfikator procesu. Jeśli potrzebujesz więcej procesów, po prostu dodaj więcej specyfikacji dziecka do listy.

+0

Dziękuję @legoscia. Sprawdziłem mój plik app.src i mod jest tam '{aplikacji, dummys, [ {description "manekin aplikacja"}, {Vsn "1"}, { zarejestrowany, []}, {aplikacje [jądro , stdlib ]}, {mod {dummys_app, []}}, { env []} ]}. ' – cyrillk

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

Powyższy kod nie zadziała, ponieważ application:start([dummys]) zostanie wywołana.

Aby uzyskać szczegółowe informacje, można uzyskać referencję urządzenia Erlang documentation.

Twoim przypadku,

erl -noshell -pa ebin -s dummys 
Powiązane problemy