Erlang,如何使用依赖项加载应用程序

Ark*_*nez 6 erlang startup erlang-otp

我的群集中有一些应用程序,我需要在不同的主机上启动其中一些应用程序.

故事是Erlang集群已经在运行,所以尽管每个应用程序都有我的.app资源文件,说明应该在我的应用程序之前启动哪些应用程序,但这只能用于创建启动脚本,而不是在已经运行的情况下启动应用程序节点.

目前我有一个使用应用程序的自定义例程:get_key(应用程序,应用程序)来提取依赖项并在启动给定应用程序之前单独启动它们.

我想知道是否有更好的方法来做到这一点.

Rog*_*mbe 15

自Erlang R16B02以来,也有application:ensure_all_started.


arc*_*lus 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}).
Run Code Online (Sandbox Code Playgroud)

然后,您可以添加-s myapp_app到erlang命令行,这将以递归方式启动应用程序及其所有依赖项.为什么这个功能不在应用程序模块中我不知道:)


在我的Erlang Factory 2012 SFBay示例应用程序中有一个这个自定义erlang app启动代码的工作示例.


Jer*_*ond 2

在启动脚本之外启动应用程序时,您需要首先启动依赖项。您可以构建智能来在应用程序本身中执行此操作,以便当应用程序启动时,它将在需要它们之前启动任何所需的依赖项。

我见过这种做法的一个地方是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).
Run Code Online (Sandbox Code Playgroud)