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
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
|