通过相对路径加载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

点赞
stackoverflow用户726361
stackoverflow用户726361

你可以这样做:

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
2012-02-04 23:11:00
stackoverflow用户312586
stackoverflow用户312586

有一种推断文件“本地路径”的方法(更具体地说,是使用的字符串加载文件)。

如果在 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.luafolderOfThisFile 将自动更新。

2012-02-05 03:21:09
stackoverflow用户289912
stackoverflow用户289912

在 Conky 的 Lua 环境下,我成功地通过 require(".common") 来包含在同一目录下的 common.lua 文件。请注意前面的点号 . 字符。

2016-05-30 12:45:36
stackoverflow用户1253415
stackoverflow用户1253415

我正在使用以下代码片段。它应该适用于使用 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
2016-08-20 03:52:25
stackoverflow用户13533793
stackoverflow用户13533793

尝试一下:这是我的发现:

module1 = require(".\\moduleName")
module2 = dofile("..\\moduleName2.lua")
module3 = loadfile("..\\module3.lua")

要从当前目录加载,请在前面加上一个完整的句点并附上一个双反斜杠。

要指定一个上层目录,请使用两个完整句点的前缀,并对任何此类目录重复此模式,例如:

module4 = require("..\\..\\module4")
2021-06-17 15:24:17