49

如果我有这样的文件结构:

./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 一起使用。

4

5 回答 5

43

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

如果你需要一个文件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.luafolderOfThisFile将自动更新。

于 2012-02-05T03:21:09.360 回答
21

你可以做

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
于 2012-02-04T23:11:00.173 回答
1

我正在使用以下代码段。它既适用于使用 . 加载的文件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-20T03:52:25.063 回答
0

在 Conky 的 Lua 环境下,我设法将我的common.lua(在同一目录中)包含为require(".common"). 注意前导点.字符。

于 2016-05-30T12:45:36.717 回答
0

试试这个:这是我的发现:

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

从当前目录加载。附加一个带有句号前缀的双反斜杠。

要指定上面的目录,请使用两个句号的前缀,并对任何此类目录重复此模式。例如

module4=require("..\\..\\module4")
于 2021-06-17T15:24:17.823 回答