【发布时间】:2016-07-10 09:35:42
【问题描述】:
代码交换:Achieving code swapping in Erlang's gen_server
模块重新定义:
iex(node2@127.0.0.1)6> Code.load_file("mesngr.ex", "./lib")
[{Mesngr,
<<70, 79, 82, 49, 0, 0, 12, 72, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 255, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, ...>>}]
iex(node2@127.0.0.1)8> Code.load_file("mesngr.ex", "./lib")
lib/mesngr.ex:1: warning: redefining module Mesngr
[{Mesngr,
<<70, 79, 82, 49, 0, 0, 12, 72, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 255, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, 100, 0, ...>>}]
iex(node2@127.0.0.1)9>
我已经注意到某些差异,例如在模块重新定义的情况下不会调用 GenServer 的 code_change 回调(因为我假设只是覆盖,而不是从新 -> 当前和当前 -> 旧的转换)。但我也注意到像这样重新定义模块确实会改变底层代码(这在 FP 语言中是有意义的)。
我想我的问题归结为以下几点:
- 在开发和生产期间简单地重新定义模块会有多好/坏/丑?
- 在版本管理和回滚之外进行适当的代码交换有什么好处?是否有关于该主题的优秀教程/手册/文章?
- 与模块重新定义相比,热代码交换如何在后台工作?
【问题讨论】:
标签: elixir