Lua嵌套的Require路径

Lua嵌套的Require路径,lua,nlua,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

我正在编写一个工具来解析其他用户创建的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


谢谢

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

package.path上的资源

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

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

package.path = package.path .. ';./foo/?.lua'
字符将位于传递给require的字符串所在的位置


或者,您可以将要加载的默认文件添加到
包中。路径

package.path = package.path .. ';./nested_require.lua' 
然后在此文件中定义所需的行为。您可以使用全局变量
\u REQUIREDNAME
引用传递给require函数的值


此方法的文档可以在页面底部找到:

我使用节点lua测试了此脚本,它为我解决了问题

相关代码:

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
要使其与Lua5.2配合使用,请将package.loaders的所有用法更改为package.searchers

此外,如果要覆盖全局require函数,还需要此代码段:

_G.require = require

我使用node lua测试了这个脚本,它为我解决了这个问题!我非常感谢您的帮助,但基本行为还不够,因为我需要根据包含require语句的文件动态更改路径。当我找到我需要的要点时,我添加了一个答案,但是版主删除了它。我刚刚添加了更多细节。我已经编辑了我的答案以反映您的评论。然而,重新定义require并不是应该做的事情。即使在极端情况下,简单地将package.path更改为特定的默认文件也是更好的选择。