You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lua中定义文件被require时自动触发的前置执行函数?

实现Lua模块加载前的前置执行逻辑

要实现指定模块被require时自动执行前置代码,且模块未被调用时不执行,可以通过修改Lua的模块搜索机制来实现,具体方案如下:

核心思路

借助Lua的package.searchers(Lua 5.2+)或package.loaders(Lua 5.1)钩子,在模块实际加载前插入自定义逻辑:

  • 先保存原有的模块搜索器列表
  • 插入自定义搜索器,检查当前要加载的模块是否为目标模块
  • 匹配目标模块时,先执行前置代码,再调用原搜索器完成模块加载
  • 非目标模块则直接交给原搜索器处理

代码实现

-- 定义目标模块名和前置执行函数
local target_module = "FILE"
local before_load = function()
    -- 这里编写模块加载前需要执行的逻辑
    print("FILE模块即将加载,执行前置操作")
end

-- 兼容Lua版本,获取原搜索器列表
local original_searchers = {}
local searchers = package.searchers or package.loaders
for i, searcher in ipairs(searchers) do
    original_searchers[i] = searcher
end

-- 构建新的搜索器列表,插入自定义逻辑
local new_searchers = {}

-- 自定义搜索器:优先处理目标模块
table.insert(new_searchers, function(modname)
    if modname == target_module then
        -- 触发前置执行逻辑
        before_load()
        -- 调用原搜索器找到模块加载器并返回
        for _, searcher in ipairs(original_searchers) do
            local loader = searcher(modname)
            if type(loader) == "function" then
                return loader
            end
        end
    end
    -- 非目标模块,返回nil让后续搜索器处理
    return nil
end)

-- 追加原搜索器到新列表
for _, searcher in ipairs(original_searchers) do
    table.insert(new_searchers, searcher)
end

-- 替换回package的搜索器
if package.searchers then
    package.searchers = new_searchers
else
    package.loaders = new_searchers
end

-- 其他业务代码
-- some other stuff

-- 调用require时会触发前置逻辑
require(target_module)

-- 若注释掉上面的require,前置函数不会执行

关键说明

  • 自定义搜索器会优先匹配目标模块,只有当模块被require调用时,前置函数才会执行
  • 代码兼容Lua 5.1及以上版本,自动适配不同版本的搜索器接口
  • 不破坏原有模块加载逻辑,仅对目标模块插入前置处理

内容的提问来源于stack exchange,提问作者Rory Nesbitt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:35:17