2016-03-27 11 views
2

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!

Antwort

3

Sie benötigen Anwendung in Ihrem application's .app resource filex als abhängige Anwendung aufzulisten, oder weil Sie rebar mit bist, in Ihrer .app.src Datei:

{application, your_app, 
[{description,"your application"}, 
    {vsn, "0.1"}, 
    {modules,[]}, 
    {registered, []}, 
    {mod,{your_app,[]}}, 
    {env, []}, 
    {applications,[kernel, stdlib, x]}]}. 

Hinweis in der letzten Zeile, die x als Anwendungsabhängigkeit aufgeführt ist. Dies führt dazu, dass der Erlang Application Controller sicherstellt, dass x gestartet wird, bevor er Ihre Anwendung startet. Und wenn Sie Ihre Anwendung interaktiv in einer Erlang-Shell über application:ensure_all_started/1,2 starten, stellt diese Deklaration sicher, dass x zuerst gestartet wird, bevor Ihre App gestartet wird.

+0

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

+1

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. –

+0

Was ist mit dem Beenden der Anwendung? Ruft '' application: stop (y). '' Auch 'x' auf? – goncalotomas