- 变更非Erlang代码
变更非Erlang代码
变更用Erlang之外的编程语言所写的程序的代码,比如一个端口程序,是和应用紧密相关的,OTP没有为此提供特别的支持。
例如,更改端口程序的代码:假设控制该port的Erlang进程是一个 gen_server portc 同时该端口是在回调函数 init/1 中打开的:
- init(...) ->
- ...,
- PortPrg = filename:join(code:priv_dir(App), "portc"),
- Port = open_port({spawn,PortPrg}, [...]),
- ...,
- {ok, #state{port=Port, ...}}.
如果要更新端口程序,那么我们可以扩展gen_server的代码,加入一个关闭旧端口并打开新端口。(如果必要的话,gen_server可以先从端口程序请求需要保存的数据,然后将这些数据传送到新的端口中):
- code_change(_OldVsn, State, port) ->
- State#state.port ! close,
- receive
- {Port,close} ->
- true
- end,
- PortPrg = filename:join(code:priv_dir(App), "portc"),
- Port = open_port({spawn,PortPrg}, [...]),
- {ok, #state{port=Port, ...}}.
在 .app 文件中更新应用版本并编写一个 .appup 文件:
- ["2",
- [{"1", [{update, portc, {advanced,port}}]}],
- [{"1", [{update, portc, {advanced,port}}]}]
- ].
确保C程序所在的 priv 目录也被包含在了新的发布包中:
- 1> systools:make_tar("my_release", [{dirs,[priv]}]).
- ...