一个 lua 热更新的模块,主要针对一个模块里面的某些局部函数,全局函数更新,并不针对整个模块文件进行更新,并且 做到在更新过程中出现的语法错误时,撤销本次热更,尽可能不让热更新影响整个程序流程,测试用例7 有提到。 对于热更新,我写了一篇博客,可以先了解下 https://www.jianshu.com/p/30416db4f649
- lua5.2 版本以上
examples 目录下面有几个测试用例,运行方式如下:
cd examples/test1
lua main.lua
- 加载新模块
local hotfix = require "hotfix"
hotfix.module(list)
其中 module 参数是一个列表,以数组的形式传入,数组中的每一项,包含旧模块表,以及新模块路径,例如:
{
{tb1, "./tb1_new.lua"},
{tb2, "./tb2_new.lua"}
}
这个在测试用例8 中有使用到
- 更新局部函数,或者表中的函数
fix(name, function)
其中 name 是需要更新的函数名称,function 是新的函数体,如果要更新 tb1 表里面的方法,要用 *__module* 来取代 tb1,因为 tb1 是做为更新模块入口
- 更新全局函数 对于全局函数的更新,最好函数体里面用到的变量,上值都是全局的,不然容易更新失败
- 对于更新的函数,如果要添加新的函数,变量调用,需要自己手动声明,但不必赋值
- 对于同一个模块中,不能出现两个名称一样的函数,保证唯一性,保证热更正确
- 如果要更新的函数存到一个 hashmap 中,通过 key 来索引函数。这种情况下更新函数也是不起作用的,因为更新后的函数并不会自动存到 hashmap 中