lua reload lua脚步重启热更



-- 外部库 登记
local package_list = {
    bit = true 
}

-- 全局性质类/或禁止重新加载的文件记录
local ignored_file_list = {
    global = true ,
}

--已重新加载的文件记录
local loaded_file_list = {}

--视图排版控制
function leading_tag( indent )
    -- body
    if indent < 1 then
        return ''
    else
        return string.rep( '    |',  indent - 1  ) .. '    '
    end
end

--关键递归重新加载函数
--filename 文件名
--indent   递归深度, 用于控制排版显示
function recursive_reload( filename, indent )
    -- body
    if package_list[ filename] then 
        --对于 外部库, 只进行重新加载, 不做递归子文件
        --卸载旧文件
        package.loaded[ filename] = nil

        --装载信文件
        require( filename )

        --标记"已被重新加载"
        loaded_file_list[ filename] = true

       --print( leading_tag(indent) .. filename .. "... done" )
        return true
    end

    --普通文件
    --进行 "已被重新加载" 检测
    if loaded_file_list[ filename] then 
        --print( leading_tag(indent) .. filename .. "...already been reloaded IGNORED" )
        return true
    end

    --读取当前文件内容, 以进行子文件递归重新加载
    local file, err = io.open( filename..".lua" )
    if file == nil then 
        print( string.format( "failed to reaload file(%s), with error:%s", filename, err or "unknown" ) )
        return false
    end

    print( leading_tag(indent) .. filename .. "..." )

    --读取每一行
    for line in file:lines() do 
        
        --识别 require(...)行, 正则表达? 模式匹配? 并拾取文件名 到 subFileName
        line = string.gsub( line, '%s', '' )
        local subFileName = nil 
        local ret = string.gsub( line, '^require%("(.+)"%)', function ( s ) subFileName = s end )

        if subFileName then
            --进行递归 
            local success = recursive_reload( subFileName, indent + 1 )
            if not success then 
                print( string.format( "failed to reload sub file of (%s)", filename ) )
                return false 
            end

        end
        
    end    


    -- "后序" 处理当前文件...

    
    if ignored_file_list[ filename] then
        --忽略 "禁止被重新加载"的文件
        print( leading_tag(indent) .. filename .. "... IGNORED" )
        return true
    else

        --卸载旧文件
        package.loaded[ filename] = nil

        --装载新文件
        require( filename )

        --设置"已被重新加载" 标记
        loaded_file_list[ filename] = true
        print( leading_tag(indent) .. filename .. "... done" )
        return true
    end
end

--主入口函数
function reload_script_files()
    
    print( "[reload_script_files...]")

    loaded_file_list = {}

    --本项目是以 main.lua 为主文件,也可以指定加载某个文件
    recursive_reload( "main", 0 )
    --recursive_reload("baseClass.BaseClass", 0)
    
    print( "[reload_script_files...done]")

    return "reload ok"
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值