如何在Lua库中组织内部依赖关系?

我正在努力想出如何构建并使用我正在编写的 Lua 库中的内部依赖关系。

我已经像这样定义了我的库:

./alib.lua
./alib/adependency.lua

以及代码:

-- 文件:./alib.lua
local ad = require "alib.adependency"
module( "alib")
return {}

-- 文件:./alib/adependency.lua
module( "adependency" )
return {}

这很好用:

$ lua alib.lua
<无输出>

现在把这个库“添加”到另一个应用程序中:

./anapp.lua
./lib/alib.lua
./lib/alib/adependency.lua

以及新代码:

-- 文件:./anapp.lua
local alib = require "lib.alib"
local print = print
module( "anapp")
print "Hello"

尝试运行它:

$ lua anapp.lua
lua: ./lib/alib.lua:2: module 'alib.adependency' not found:
    no field package.preload['alib.adependency']
    no file './alib/adependency.lua'
    no file '/usr/local/share/lua/5.1/alib/adependency.lua'
    no file '/usr/local/share/lua/5.1/alib/adependency/init.lua'
    no file '/usr/local/lib/lua/5.1/alib/adependency.lua'
    no file '/usr/local/lib/lua/5.1/alib/adependency/init.lua'
    no file '/usr/share/lua/5.1/alib/adependency.lua'
    no file '/usr/share/lua/5.1/alib/adependency/init.lua'
    no file './alib/adependency.so'
    no file '/usr/local/lib/lua/5.1/alib/adependency.so'
    no file '/usr/lib/x86_64-linux-gnu/lua/5.1/alib/adependency.so'
    no file '/usr/lib/lua/5.1/alib/adependency.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
    no file './alib.so'
    no file '/usr/local/lib/lua/5.1/alib.so'
    no file '/usr/lib/x86_64-linux-gnu/lua/5.1/alib.so'
    no file '/usr/lib/lua/5.1/alib.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
    [C]: in function 'require'
    ./lib/alib.lua:2: in main chunk
    [C]: in function 'require'
    anapp.lua:2: in main chunk
    [C]: ?

天啊。现在我必须在库内部手动进行编辑:

-- 文件:./lib/alib.lua
-- local ad = require "alib.adependency" -- 不起作用
local ad = require "lib.alib.adependency" -- 起作用
module( "alib")
return {}

然后它就工作了:

$ lua anapp.lua
Hello

似乎 Lua 的 require() 是相对于 Lua 通过运行的最终脚本的路径,而不是调用 require() 的脚本的路径。

当然,您不必每次将 Lua 库添加到项目中时都手动修复 require() 内部的内部路径……我也不知道这如何从单元测试的角度工作。我做错了什么?

点赞
用户1171043
用户1171043

我认为最干净的解决方案是保留你的库不变,然后让使用你的库的人负责正确配置package.path。在你的设置中,这意味着应用程序应该将lib文件夹添加到路径中:

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

还可以参考相关问题,比如 Is there a better way to require file from relative path in lua,以及手册了解有关路径的更多信息。

2013-04-13 15:31:36