Lua中相对路径为何相对执行目录?如何改为相对脚本所在目录?
问题原因
Lua标准库中的dofile、loadfile等文件加载函数,底层直接调用操作系统的文件访问接口,操作系统解析相对路径时,默认的基准路径是进程的当前工作目录(CWD),也就是你执行lua命令时所处的目录,和脚本文件本身的存放路径没有关系,所以才会出现不同执行目录下运行同一条命令结果不一致的情况。
实现基于脚本自身路径的相对路径加载
可以通过获取当前执行脚本的存放路径,拼接目标相对路径得到绝对路径后再加载,就可以实现类似CommonJS的require效果,具体实现如下:
封装自定义相对路径加载函数
local function require_relative(relative_path) -- 获取调用当前函数的脚本的文件信息 local info = debug.getinfo(2, "S") -- 去掉调试信息中脚本路径开头的@符号 local script_path = info.source:sub(2) -- 提取当前脚本的所在目录,兼容Windows和Unix路径格式 local current_dir = script_path:match("(.*[/\\])") or "./" -- 拼接得到目标文件的绝对路径 local absolute_path = current_dir .. relative_path -- 实现和原生require一致的缓存逻辑,避免重复加载 if not package.loaded[absolute_path] then local load_func, err = loadfile(absolute_path) if not load_func then error("加载文件失败:" .. absolute_path .. ",错误信息:" .. err) end local module = load_func() package.loaded[absolute_path] = module or true end return package.loaded[absolute_path] end
改造后的b.lua代码
-- 上面的require_relative函数可以放在公共工具模块引入,也可以直接写在当前脚本顶部 require_relative("../a.lua") print(foo)
改造完成后,不管你在哪个目录执行lua subdirectory/b.lua,路径解析始终以b.lua自身的存放目录为基准,都能正常找到a.lua文件。
内容的提问来源于stack exchange,提问作者Nirvana
相关产品推荐
相关产品推荐

