6

クラスタにいくつかのアプリがあります。それらのいくつかを別のホストで起動する必要があります。

ストーリーは、Erlangクラスターがすでに実行されているため、アプリケーションごとに.appリソースファイルがあり、どのアプリケーションを開始する必要があるかを示していますが、これは起動スクリプトを作成するためにのみ機能し、既に実行中のアプリを開始するためには機能しません。ノード。

現在、application:get_key(Application、applications)を使用して依存関係を抽出し、特定のアプリケーションを開始する前にそれらを個別に開始するカスタムルーチンがあります。

これを行うためのより良い方法はないかと思いました。

4

4 に答える 4

15

Erlang R16B02以降、もありapplication:ensure_all_startedます。

于 2014-03-07T11:54:18.897 に答える
7

率直に言って、Erlangでこれを行うための標準ツールは今のところ不必要に迷惑です。私は、アプリケーションのコールバックモジュールに次の定型文を配置する傾向があります。

-module(myapp_app).
-export([start/0]).

start() -> a_start(myapp, permanent).

a_start(App, Type) ->
    start_ok(App, Type, application:start(App, Type)).

start_ok(_App, _Type, ok) -> ok;
start_ok(_App, _Type, {error, {already_started, _App}}) -> ok;
start_ok(App, Type, {error, {not_started, Dep}}) ->
    ok = a_start(Dep, Type),
    a_start(App, Type);
start_ok(App, _Type, {error, Reason}) ->
    erlang:error({app_start_failed, App, Reason}).

次に、erlangコマンドラインに追加-s myapp_appすると、アプリとそのすべての依存関係が再帰的に起動します。なぜこの関数がアプリケーションモジュールにないのかわかりません:)


私のErlangFactory2012 SFBayサンプルアプリには、このカスタムerlangアプリスタートアップコードの実用的な例があります。

于 2012-05-09T21:55:33.743 に答える
2

起動スクリプトの外部でアプリを起動するときは、最初に依存関係を起動する必要があります。これをアプリ自体に組み込むためのスマートを構築して、アプリの起動時に、必要な依存関係が必要になる前に開始されるようにすることができます。

これが行われているのを見た場所の1つは、Mochiwebアプリです。デフォルトのアプリテンプレートには、起動時に依存関係を読み込むためのコードが含まれています。

-module(some_app).
-export([start/0, stop/0]).

ensure_started(App) ->
    case application:start(App) of
        ok ->
            ok;
        {error, {already_started, App}} ->
            ok
    end.

%% @spec start() -> ok
%% @doc Start the some_app server.
start() ->
    some_app_deps:ensure(),
    ensure_started(crypto),
    application:start(some_app).

%% @spec stop() -> ok
%% @doc Stop the some_app server.
stop() ->
    application:stop(some_app).
于 2012-05-09T02:11:56.217 に答える
0

「OTP設計原則」に基づいてアプリを作成する場合は、「アプリケーション」セクションを含むyourappname.appファイルを作成する必要があります。このセクションでは、自分の前に開始する他のアプリケーションを定義します。ここに述べられています:

アプリケーション

このアプリケーションを開始する前に開始する必要があるすべてのアプリケーション。systoolsはこのリストを使用して、正しいブートスクリプトを生成します。デフォルトは[]ですが、すべてのアプリケーションには少なくともkernelとstdlibへの依存関係があることに注意してください。

したがって、リリースを使用する場合、この依存関係の解決はsystoolsによって解決されます。

于 2012-05-09T06:53:19.657 に答える