如果我有这样的文件结构:
./main.lua
./mylib/mylib.lua
./mylib/mylib-utils.lua
./mylib/mylib-helpers.lua
./mylib/mylib-other-stuff.lua
从
main.lua
可以使用完整路径 mylib.lua
加载文件 require('mylib.mylib')
。但在mylib.lua
内部,我还想加载其他必要的模块,并且我不喜欢总是指定完整路径(例如mylib.mylib-utils
)。如果我决定移动该文件夹,我将进行大量搜索和替换。有没有办法只使用路径的相对部分?
UPD。我正在将 Lua 与 Corona SDK 一起使用,如果这很重要的话。
有一种方法可以推导文件的“本地路径”(更具体地说,是用于加载文件的字符串)。
如果您需要
lib.foo.bar
中的文件,您可能会执行以下操作:
require 'lib.foo.bar'
然后,当您位于所有函数之外时,您可以获取文件的路径作为第一个元素(也是唯一的)
...
变量。换句话说:
-- lib/foo/bar.lua
local pathOfThisFile = ... -- pathOfThisFile is now 'lib.foo.bar'
现在,要获取“文件夹”,您需要删除文件名。最简单的方法是使用匹配:
local folderOfThisFile = (...):match("(.-)[^%.]+$") -- returns 'lib.foo.'
现在就完成了。现在您可以将该字符串添加到其他文件名前面并使用它来要求:
require(folderOfThisFile .. 'baz') -- require('lib.foo.baz')
require(folderOfThisFile .. 'bazinga') -- require('lib.foo.bazinga')
如果您移动
bar.lua
,folderOfThisFile
将会自动更新。
你可以做
package.path = './mylib/?.lua;' .. package.path
或者
local oldreq = require
local require = function(s) return oldreq('mylib.' .. s) end
然后
-- do all the requires
require('mylib-utils')
require('mylib-helpers')
require('mylib-other-stuff')
-- and optionally restore the old require, if you did it the second way
require = oldreq
我正在使用以下代码片段。它应该适用于使用
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
在Conky的Lua环境下,我成功地将我的
common.lua
(在同一目录中)包含为require(".common")
。请注意前导点 .
字符。
试试这个:这是我的发现:
module1= require(".\\moduleName")
module2= dofile("..\\moduleName2.lua")
module3 =loadfile("..\\module3.lua")
从当前目录加载。添加带有句点前缀的双反斜杠。
要指定上面的目录,请使用两个句点的前缀,并对任何此类目录重复此模式。例如
module4=require("..\\..\\module4")
我已经发布了一个 lua 模块来执行此操作
https://github.com/yogeshlonkar/lua-import
它可以通过 luarocks 或简单复制/粘贴作为单个文件使用,无需任何依赖项。
我需要这个来进行 neovim 配置