- 应用升级文件
应用升级文件
要定义如何在应用的当前和上一版本之间进行升级和降级,我们要创建一个应用升级文件,简称 .appup 文件。该文件必须被命名为 Application.appup ,其中 Application 是应用的名称:
- {Vsn,
- [{UpFromVsn1, InstructionsU1},
- ...,
- {UpFromVsnK, InstructionsUK}],
- [{DownToVsn1, InstructionsD1},
- ...,
- {DownToVsnK, InstructionsDK}]}.
Vsn 是一个字符串表示应用当前的版本,和定义在 .app 文件中的一样。每个 UpFromVsn 是要从应用的哪个版本升级上来,每个 DownToVsn 是应用要降级至的版本。每个 Instructions 是一个发布处理指令的列表。
appup 文件的语法和内容在 appup(4) 中有详细的描述。
在 Appup Cookbook 中,给出了典型升级/降级案例的 .appup 文件范例。
例如:想一下来自 发布 一章的发布 ch_rel-1 。假设我们要给服务器 ch3 添加一个函数 available/0 ,它返回可用的频道的数量:
- -module(ch3).
- -behaviour(gen_server).
- -export([start_link/0]).
- -export([alloc/0, free/1]).
- -export([available/0]).
- -export([init/1, handle_call/3, handle_cast/2]).
- start_link() ->
- gen_server:start_link({local, ch3}, ch3, [], []).
- alloc() ->
- gen_server:call(ch3, alloc).
- free(Ch) ->
- gen_server:cast(ch3, {free, Ch}).
- available() ->
- gen_server:call(ch3, available).
- init(_Args) ->
- {ok, channels()}.
- handle_call(alloc, _From, Chs) ->
- {Ch, Chs2} = alloc(Chs),
- {reply, Ch, Chs2};
- handle_call(available, _From, Chs) ->
- N = available(Chs),
- {reply, N, Chs}.
- handle_cast({free, Ch}, Chs) ->
- Chs2 = free(Ch, Chs),
- {noreply, Chs2}.
现在必须创建一个新版本的 ch_app.app 文件,其中版本号更新了:
- {application, ch_app,
- [{description, "Channel allocator"},
- {vsn, "2"},
- {modules, [ch_app, ch_sup, ch3]},
- {registered, [ch3]},
- {applications, [kernel, stdlib, sasl]},
- {mod, {ch_app,[]}}
- ]}.
要将 ch_app 从“1
”升级到“2
”(以及从“2
”降级到“1
”),我们只需要载入新(或旧) 版本的 ch3 回调模块。我们在 ebin 目录下创建了应用升级文件 ch_pp.appup :
- {"2",
- [{"1", [{load_module, ch3}]}],
- [{"1", [{load_module, ch3}]}]
- }.