Ich baue ein System, das eine zuvor gebaute OTP-Anwendung verwenden muss (nennen wir es X). Wenn ich eine neue OTP-Anwendung/Modul erstellen möchte, wie kann ich beispielsweise die Anwendung verwenden, die bereits von einem Modul existiert?Kann ich eine vorhandene OTP-Anwendung in einer anderen Anwendung oder einem anderen Modul verwenden?
Ich nahm an, ich start
nennen könnte, da es die application
Verhalten folgt, und so baute ich eine minimalistische Anwendung Y, die den folgenden Code hat:
y.erl:
-module(y).
-behaviour(application).
start(_StartType, _StartArgs) ->
io:format("going to call x_app~n"),
{ok, _} = x_app:start([]),
io:format("called x_app~n"),
y:start_link().
stop(_State) ->
ok = x_app:stop([]),
ok.
Rebar kompiliert diese Code erfolgreich und generiert keine Warnungen.
rel/y/bin/y start
gibt nichts (Ich hatte gehofft, die Ausgabe von mindestens einem io:format
zu bekommen) rel/y/bin/y stop
Ausgänge Node is not running!
Vielen Dank für Ihre Antwort. Das würde bedeuten, dass ich, wenn ich 'application: start (y) .' nach der richtigen Konfiguration von' x.app.src' verwende, die erwarteten Ergebnisse sehen würde? Ich sollte wahrscheinlich die 'x_app: start ([]). 'Zeilen fallen lassen? – goncalotomas
Richtig, Sie sollten die App nicht wie gewohnt mit Ihrem eigenen Code starten. Wenn "y" von "x" abhängt, listet "x" in "y.app.src" auf, wie ich gezeigt habe, und die normale Erlang-Startup-Maschinerie stellt sicher, dass sie in der richtigen Reihenfolge gestartet werden. –
Was ist mit dem Beenden der Anwendung? Ruft '' application: stop (y). '' Auch 'x' auf? – goncalotomas