2013-05-21 10 views
11

Ich bin neu in Erlang Welt und kann derzeit nicht herausfinden, wie ich meine Dummy Erlang-Anwendung starten. Wahrscheinlich verpasse ich gerade etwas ... Also, ich habe eine Anwendung mit Bewehrung (rebar create-app appid = dummys) erstellt.Wie erlang (rebar build) Anwendung läuft

Zur Zeit habe ich

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

Ich habe festgestellt, dass es besser ist, um eine Anwendung während einer Entwicklung zu starten, eine zusätzliche Startmethode zu erstellen, die die Anwendung aufrufen soll: start (modul).

habe ich einige grundlegende Protokollierung meiner Startmethoden ..

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

Wenn ich

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

es versuchen, nicht ausgegeben werden ..

Wenn ich

erl -noshell -pa ebin -s dummys start 
versuchen

erl stürzt mit einem Fehler ab r ..

Wenn ich versuche,

erl -noshell -pa ebin -s dummys_app start 

es gibt nur "Start app (dev) .." und das ist alles. Aber ich erwarte auch zu sehen "Start app .."

Was ich vermisse oder falsch mache ??

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

Und noch eine Frage: Wie richtig ein neues Modul zu meiner Dummy-Anwendung hinzufügen? Zum Beispiel habe ich ein zusätzliches Modul namens "* dummys_cool *", das eine "start" Methode hat. Wie kann ich meiner Anwendung mitteilen, dass sie die Methode "dummys_cool # start" ausführen soll?

Vielen Dank!

Antwort

12

Für die schnelle Entwicklung, wenn Sie nur Ihre appliction beginnen sicherstellen wollen, eine Shell starten, starten Sie die Anwendung:

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

Das gibt Ihnen einen sauberen Hinweis darauf, was falsch und richtig ist, ohne dass die Bombardierung danach.

Da Sie eine Anwendung zum Ausführen erstellen und nicht nur eine Bibliothek freigeben möchten, sollten Sie eine Freigabe erstellen. Rebar können Sie die meisten der Weg dorthin gelangen:

rebar generate 

ein tragbares Release Dies wird bauen, die alle erforderlichen Bibliotheken enthält:

mkdir rel 
cd rel 
rebar create-node nodeid=dummysnode 

Nachdem Sie Ihre Anwendung kompiliert haben, können Sie eine Freigabe erstellen und sogar das Erlang Laufzeitsystem. Dies wird standardmäßig im Verzeichnis rel/angegeben. in deinem Fall rel/dummys.

In diesem Verzeichnis gibt es ein Steuerskript, die Sie starten können, stoppen und auf die Anwendung an:

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

Vielen Dank für Erklärung! Schließlich habe ich herausgefunden, wie alles zusammen funktioniert. – cyrillk

+0

Das ist solide Beratung. Es scheint, dass sich die Semantik mit rebar3 etwas verändert hat. Die Dokumentation ist großartig (https://www.rebar3.org/docs/releases). Überprüfen Sie speziell {dev_mode, true}. –

2

Werfen Sie einen Blick auf Ihre dummys.app.src Datei. Die Bedeutung aller Direktiven wird in the 'app' manpage erklärt, aber die ich vermisse hier ist mod, die den Namen Ihrer Anwendung Callback-Modul angibt. So stellen Sie sicher, dass diese Zeile vorhanden ist:

{mod, {dummys_app, []}} 

Die leere Liste in wird es als StartArgs Argument dummys_app:start/2 geben werden.


Um ein neues Modul zusammen mit Ihrer Anwendung zu starten, fügen Sie es dem Überwachungsbaum in dummys_sup:init hinzu.Diese Funktion sollte ungefähr so ​​aussehen:

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

Die in the 'supervisor' manpage beschrieben wird, aber im Grunde bedeutet dies, dass beim Start dieses Supervisor eines Kind-Prozess gestartet wird. dummys_cool:start_link() wird aufgerufen, und es wird erwartet, dass diese Funktion einen neuen Prozess hervorbringt, eine Verbindung zu ihr herstellt und ihre Prozess-ID zurückgibt. Wenn Sie mehr Prozesse benötigen, fügen Sie der Liste einfach weitere untergeordnete Spezifikationen hinzu.

+0

Danke @legoscia. Ich habe meine app.src Datei überprüft und mod ist es '{Anwendung, Dummys, [ {description "Dummy-Applikation"}, { vsn, "1"}, { registriert, []}, {Anwendungen [ Kernel, stdlib ]}, { mod, {dummys_app, []}}, { env []} ]}. ' – cyrillk

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

Der obige Code wird nicht funktionieren, weil application:start([dummys]) aufgerufen wird.

Sie können eine Referenz der Erlang documentation für Details nehmen.

Für Ihren Fall

erl -noshell -pa ebin -s dummys