2016-03-27 6 views
2

以前に構築されたOTPアプリケーションを使用する必要があるシステムを構築しています(Xと呼ぶことができます)。新しいOTPアプリケーション/モジュールを構築したい場合は、たとえばモジュールから既に存在するアプリケーションをどのように使用できますか?既存のOTPアプリケーションを別のアプリケーションまたはモジュール内で使用できますか?

私はそれがapplication動作に従い以来、私は、startを呼び出すことができますと仮定し、私は次のコードを持って最小限のアプリケーションYを構築しました:

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. 

鉄筋はこれをコンパイルコードは正常に実行され、警告は生成されません。
rel/y/bin/y start出力まったく何も(私は、少なくとも1 io:formatの出力を取得することを望んだ) rel/y/bin/y stop出力Node is not running!

答えて

3

あなたがrebarを使用しているので、あなたはあなたのapplication's .app resource fileにおける依存アプリケーションとしてアプリケーションxをリストする必要がある、または、 xは、アプリケーションの依存関係としてリストされている非常に最後の行で

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

注:お使いの.app.srcファイルインチこれにより、アプリケーションを起動する前にErlangアプリケーションコントローラがxを起動することが保証されます。また、アプリケーションをapplication:ensure_all_started/1,2経由でErlangシェルでインタラクティブに起動している場合、この宣言により、アプリケーションが起動する前にxが最初に起動されます。

+0

ありがとうございます。だから、 'x:app.src'の適切な設定の後に' application:start(y).'を使用すると、私は期待される結果が得られるでしょうか?私はおそらく 'x_app:start([])'行を削除するべきでしょうか? – goncalotomas

+1

正しいですが、あなたが示したようにあなた自身のコードからアプリを起動すべきではありません。 'y'が' x'に依存している場合は、 'y.app.src'に' x'をリストします。通常のErlangリリーススタートアップマシンは正しい順序で起動されます。 –

+0

アプリケーションの停止はどうですか? 'application:stop(y)'を呼び出すと 'x'も終了しますか? – goncalotomas

関連する問題