【问题标题】:Erlang, how to load applications with their dependenciesErlang,如何加载应用程序及其依赖项
【发布时间】:2012-05-17 04:23:21
【问题描述】:

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

故事是 Erlang 集群已经在运行,所以即使我的每个应用程序都有我的 .app 资源文件,说明应该在我之前启动哪些应用程序,但这仅适用于创建启动脚本,而不是启动应用程序一个已经在运行的节点。

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

我想知道是否没有更好的方法。

【问题讨论】:

    标签: erlang startup erlang-otp


    【解决方案1】:

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

    我在Mochiweb 应用程序中看到过这样做。默认app templates包含启动时加载依赖的代码:

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

    【讨论】:

      【解决方案2】:

      如果您根据“OTP 设计原则”编写应用程序,则必须创建 yourappname.app 文件,该文件将包含“应用程序”部分。本节定义您希望在您的应用程序之前启动哪些其他应用程序。 Here 声明:

      应用程序

      在此之前必须启动的所有应用程序 应用程序启动。 systools 使用此列表生成正确的 引导脚本。默认为 [],但请注意所有应用程序都有 至少依赖于内核和标准库。

      所以如果你使用releases,这个依赖解析会被systools解决。

      【讨论】:

      • 我认为这只是确保您的应用程序在所有 applications 依赖项启动之前没有启动,但实际上并没有启动它们。
      【解决方案3】:

      坦率地说,现在在 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}).
      

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


      在我的 Erlang Factory 2012 SFBay 示例应用程序中有一个 custom erlang app startup code 的工作示例。

      【讨论】:

        【解决方案4】:

        从Erlang R16B02开始,还有application:ensure_all_started

        【讨论】:

          猜你喜欢
          • 2010-09-06
          • 1970-01-01
          • 1970-01-01
          • 2021-10-21
          • 2021-12-01
          • 2018-07-24
          • 2019-07-13
          • 1970-01-01
          • 2011-08-03
          相关资源
          最近更新 更多