通过相对路径加载Lua文件。
如果我的文件结构像这样:
./main.lua
./mylib/mylib.lua
./mylib/mylib-utils.lua
./mylib/mylib-helpers.lua
./mylib/mylib-other-stuff.lua
从 main.lua
文件中,可以通过完整路径 require('mylib.mylib')
加载文件 mylib.lua
。但是在 mylib.lua
中,我还想加载其他必要的模块,而不想总是指定完整路径(例如 mylib.mylib-utils
)。如果我决定移动文件夹,我将不得不进行大量的搜索和替换。有没有一种方法可以只使用路径的相对部分?
UPD. 我正在使用带有 Corona SDK 的 Lua,如果相关的话。
原文链接 https://stackoverflow.com/questions/9145432
有一种推断文件“本地路径”的方法(更具体地说,是使用的字符串加载文件)。
如果在 lib.foo.bar
内部引用一个文件, 可能会像这样做:
require 'lib.foo.bar'
然后,当您位于所有函数之外时,可以将文件路径作为第一个(也是唯一的) ...
变量获取。 换句话说:
- lib /foo/bar.lua
local pathOfThisFile = ... -- pathOfThisFile现在是'lib.foo.bar'
现在,要获取“文件夹”,则需要删除文件名。 最简单的方法是使用 match:
local folderOfThisFile = (...):match("(.-)[^%.]+$") -- 返回'lib.foo.'
然后你就有了。 现在,你可以将该字符串前缀添加到其他文件名中,并使用该字符串进行要求:
require(folderOfThisFile .. 'baz') - 要求('lib.foo.baz')
require(folderOfThisFile .. 'bazinga') - 要求('lib.foo.bazinga')
如果移动 bar.lua
,folderOfThisFile
将自动更新。
在 Conky 的 Lua 环境下,我成功地通过 require(".common")
来包含在同一目录下的 common.lua
文件。请注意前面的点号 .
字符。
我正在使用以下代码片段。它应该适用于使用 require
加载的文件和通过命令行调用的文件。然后,在希望使用相对路径加载的文件中使用 requireRel
替代 require
。
local requireRel
if arg and arg[0] then
package.path = arg[0]:match("(.-)[^\\/]+$") .. "?.lua;" .. package.path
requireRel = require
elseif ... then
local d = (...):match("(.-)[^%.]+$")
function requireRel(module) return require(d .. module) end
end
尝试一下:这是我的发现:
module1 = require(".\\moduleName")
module2 = dofile("..\\moduleName2.lua")
module3 = loadfile("..\\module3.lua")
要从当前目录加载,请在前面加上一个完整的句点并附上一个双反斜杠。
要指定一个上层目录,请使用两个完整句点的前缀,并对任何此类目录重复此模式,例如:
module4 = require("..\\..\\module4")
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以这样做:
package.path = './mylib/?.lua;' .. package.path
或者这样做:
local oldreq = require local require = function(s) return oldreq('mylib.' .. s) end
然后:
-- 做所有需要的 require require('mylib-utils') require('mylib-helpers') require('mylib-other-stuff') -- 如果是用第二种方式,可以选择恢复旧的 require require = oldreq