• 应用升级文件

    应用升级文件

    要定义如何在应用的当前和上一版本之间进行升级和降级,我们要创建一个应用升级文件,简称 .appup 文件。该文件必须被命名为 Application.appup ,其中 Application 是应用的名称:

    1. {Vsn,
    2. [{UpFromVsn1, InstructionsU1},
    3. ...,
    4. {UpFromVsnK, InstructionsUK}],
    5. [{DownToVsn1, InstructionsD1},
    6. ...,
    7. {DownToVsnK, InstructionsDK}]}.

    Vsn 是一个字符串表示应用当前的版本,和定义在 .app 文件中的一样。每个 UpFromVsn 是要从应用的哪个版本升级上来,每个 DownToVsn 是应用要降级至的版本。每个 Instructions 是一个发布处理指令的列表。

    appup 文件的语法和内容在 appup(4) 中有详细的描述。

    Appup Cookbook 中,给出了典型升级/降级案例的 .appup 文件范例。

    例如:想一下来自 发布 一章的发布 ch_rel-1 。假设我们要给服务器 ch3 添加一个函数 available/0 ,它返回可用的频道的数量:

    1. -module(ch3).
    2. -behaviour(gen_server).
    3.  
    4. -export([start_link/0]).
    5. -export([alloc/0, free/1]).
    6. -export([available/0]).
    7. -export([init/1, handle_call/3, handle_cast/2]).
    8.  
    9. start_link() ->
    10. gen_server:start_link({local, ch3}, ch3, [], []).
    11.  
    12. alloc() ->
    13. gen_server:call(ch3, alloc).
    14.  
    15. free(Ch) ->
    16. gen_server:cast(ch3, {free, Ch}).
    17.  
    18. available() ->
    19. gen_server:call(ch3, available).
    20.  
    21. init(_Args) ->
    22. {ok, channels()}.
    23.  
    24. handle_call(alloc, _From, Chs) ->
    25. {Ch, Chs2} = alloc(Chs),
    26. {reply, Ch, Chs2};
    27. handle_call(available, _From, Chs) ->
    28. N = available(Chs),
    29. {reply, N, Chs}.
    30.  
    31. handle_cast({free, Ch}, Chs) ->
    32. Chs2 = free(Ch, Chs),
    33. {noreply, Chs2}.

    现在必须创建一个新版本的 ch_app.app 文件,其中版本号更新了:

    1. {application, ch_app,
    2. [{description, "Channel allocator"},
    3. {vsn, "2"},
    4. {modules, [ch_app, ch_sup, ch3]},
    5. {registered, [ch3]},
    6. {applications, [kernel, stdlib, sasl]},
    7. {mod, {ch_app,[]}}
    8. ]}.

    要将 ch_app 从“1”升级到“2”(以及从“2”降级到“1”),我们只需要载入新(或旧) 版本的 ch3 回调模块。我们在 ebin 目录下创建了应用升级文件 ch_pp.appup

    1. {"2",
    2. [{"1", [{load_module, ch3}]}],
    3. [{"1", [{load_module, ch3}]}]
    4. }.