Lua嵌套的需要路径

时间:2018-11-29 03:44:55

标签: lua nlua

我正在写一个工具来解析其他用户创建的lua插件。关于插件的唯一保证是,它在已知目录中具有data.lua文件。在这里,用户可以自由地做他们想做的任何事情。此特定插件使用require加载文件,而该文件加载另一个文件。两者都是相对路径,但是第二个相对于第一个文件的位置。

  • data.lua
  • foo / bar.lua
  • foo / baz.lua

data.lua:

require("foo.bar")

foo / bar.lua:

require("baz")

当我尝试执行data.lua时,当foo / bar.lua尝试要求“ baz”时出现错误。它尝试的路径都不是./foo/。

有什么主意我可以解决这个问题吗?我可以找到专门针对这种情况的任何文档,似乎我需要将/ foo /硬编码到路径中,但我不知道它是不是提前。这似乎应该是自动的,是否缺少设置或运行的Lua版本错误?我正在使用NLua 4.0

谢谢

2 个答案:

答案 0 :(得分:0)

您可以通过更改package.path变量来更改require的搜索行为。

package.path上的资源:

  

https://www.lua.org/manual/5.3/manual.html#pdf-package.path

     

http://lua-users.org/wiki/PackagePath

将foo文件夹添加到搜索位置的示例:

package.path = package.path .. ';./foo/?.lua'

?字符将放在传递给require的字符串的位置。


或者,您可以将要加载的默认文件添加到package.path

package.path = package.path .. ';./nested_require.lua' 

然后在此文件中定义您想要的行为。您可以使用全局变量_REQUIREDNAME引用传递给require函数的值。

此方法的文档可在页面底部找到:https://www.lua.org/pil/8.1.html

答案 1 :(得分:0)

我使用node-lua测试了此脚本,它为我解决了这个问题!

https://gist.github.com/hoelzro/1299679

相关代码:

local oldrequire = require

function require(modname)
  local regular_loader = package.loaders[2]
  local loader = function(inner)
    if string.match(modname, '(.*)%.') then
      return regular_loader(string.match(modname, '(.*)%.') .. '.' .. inner)
    end
  end

  table.insert(package.loaders, 1, loader)
  local retval = oldrequire(modname)
  table.remove(package.loaders, 1)

  return retval
end

要使其与Lua 5.2一起使用,请将package.loaders的所有用法更改为package.searchers。

此外,如果您想覆盖全局require函数,则也需要此代码段:

_G.require = require