应用升级文件

要定义如何在应用的当前和上一版本之间进行升级和降级,我们要创建一个应用升级文件,简称 .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. }.