以下是一个完整的、可运行的 Lua 热更新实现代码示例。它包括基础模块定义、热更新功能、状态管理,以及简单的文件监控功能。
1. 模块文件:mymodule.lua
这是需要热更新的模块文件,定义了一些简单的逻辑和状态。
-- mymodule.lua
local M = {}
-- 模块的状态
M.state = {
counter = 0
}
-- 打印问候语
function M.say_hello()
print("Hello, World!")
end
-- 累加计数器
function M.increment()
M.state.counter = M.state.counter + 1
print("Counter:", M.state.counter)
end
return M
2. 主程序:main.lua
主程序负责加载模块、调用模块逻辑,以及实现热更新功能。
-- main.lua
local lfs = require("lfs") -- LuaFileSystem,用于监控文件变化
-- 文件修改时间缓存
local file_mod_times = {}
-- 检查文件是否更新
local function check_file_updated(file)
local mod_time = lfs.attributes(file, "modification")
if file_mod_times[file] ~= mod_time then
file_mod_times[file] = mod_time
return true
end
return false
end
-- 热更新函数
local function reload_module(name)
-- 保存模块的状态
local old_module = package.loaded[name]
local old_state = old_module and old_module.state or nil
-- 重新加载模块
package.loaded[name] = nil
local new_module = require(name)
-- 恢复模块状态
if old_state then
new_module.state = old_state
end
print("Module [" .. name .. "] has been reloaded.")
return new_module
end
-- 自动检测并热更新模块
local function auto_reload(file, module_name)
if check_file_updated(file) then
return reload_module(module_name)
end
return package.loaded[module_name]
end
-- 初始化主程序
local function main()
local module_name = "mymodule"
local module_file = "mymodule.lua"
-- 加载模块
local mymodule = require(module_name)
-- 主循环
while true do
-- 模拟业务逻辑
mymodule.say_hello()
mymodule.increment()
-- 等待 5 秒钟
os.execute("sleep 5")
-- 自动热更新模块
mymodule = auto_reload(module_file, module_name)
end
end
main()
热更新步骤
1. 运行程序:
启动主程序 main.lua:
程序会每隔 5 秒调用一次模块中的方法 say_hello 和 increment,并打印计数器值。
2. 修改模块:
在程序运行时,编辑 mymodule.lua 文件,例如修改 say_hello 的实现:
function M.say_hello()
print("Hello, Lua! (Updated)")
end
保存文件。
3. 观察热更新生效:
程序会检测到 mymodule.lua 文件的变化,自动重新加载模块,并保留计数器的状态。
|