You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.1 KiB
Lua

--- Hotfix helper which hotfixes modified modules.
-- Using lfs to detect files' modification.
local M = {}
local lfs = require("lfs")
local hotfix = require("hotfix.hotfix")
local skynet = require("skynet")
-- Map file path to file time to detect modification.
local path_to_time = {}
-- global_objects which must not hotfix.
local global_objects = {
arg,
assert,
collectgarbage,
coroutine,
debug,
dofile,
error,
getmetatable,
io,
ipairs,
load,
loadfile,
math,
next,
os,
package,
pairs,
pcall,
print,
rawequal,
rawget,
rawlen,
rawset,
require,
select,
setmetatable,
string,
table,
tonumber,
tostring,
type,
utf8,
xpcall,
lfs,
skynet, -- skynet 模块不能够热更
}
--- Check modules and hotfix.
local hotfix_module_names = require("hotfix.helper.hotfix_module_names")
local function tcontains(t, value)
for _, v in pairs(t) do
if (v == value) then
return true
end
end
return false
end
function M.add(module_name)
if not tcontains(hotfix_module_names, module_name) then
-- 保证不重复
table.insert(hotfix_module_names, module_name)
end
end
function M.check()
for _, module_name in pairs(hotfix_module_names) do
-- skynet.error("hotfix module_name:", module_name)
local path, err = package.searchpath(module_name, package.path)
-- Skip non-exist module.
if not path then
skynet.error(string.format("No such module: %s. %s", module_name, err))
goto continue
end
local file_time = lfs.attributes(path, "modification")
if file_time == path_to_time[path] then
goto continue
end
skynet.error(string.format("Hot fix module %s (%s)", module_name, path))
path_to_time[path] = file_time
hotfix.hotfix_module(module_name)
::continue::
end -- for
end -- check()
function M.init()
hotfix.log_debug = function(s)
skynet.error(s)
end
hotfix.add_protect(global_objects)
end
return M