3

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

  • 数据.lua
  • foo/bar.lua
  • foo/baz.lua

数据.lua:

require("foo.bar")

foo/bar.lua:

require("baz")

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

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

谢谢

4

2 回答 2

2

我使用 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
于 2018-12-23T16:36:36.920 回答
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

于 2018-12-23T03:12:58.497 回答