如何在Lua库中构造内部依赖关系?
我正在努力弄清楚如何在我正在编写的Lua库中构造并使用内部依赖关系 我将我的库定义为:如何在Lua库中构造内部依赖关系?,lua,Lua,我正在努力弄清楚如何在我正在编写的Lua库中构造并使用内部依赖关系 我将我的库定义为: ./alib.lua ./alib/adependency.lua 以及守则: -- File: ./alib.lua local ad = require "alib.adependency" module( "alib") return {} -- File: ./alib/adependency.lua module( "adependency" ) return {} 这是一种享受: $ lua
./alib.lua
./alib/adependency.lua
以及守则:
-- File: ./alib.lua
local ad = require "alib.adependency"
module( "alib")
return {}
-- File: ./alib/adependency.lua
module( "adependency" )
return {}
这是一种享受:
$ lua alib.lua
<no output>
以及新守则:
-- File: ./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]: ?
哦,天哪。现在,我在库中进行手动编辑:
-- File: ./lib/alib.lua
-- local ad = require "alib.adependency" -- Doesn't work
local ad = require "lib.alib.adependency" -- Works
module( "alib")
return {}
它的工作原理是:
$ lua anapp.lua
Hello
Lua的require()
似乎与Lua运行的最终脚本相关的路径,而不是调用require()
的脚本
当然,每次向项目中添加Lua库时,您不必手动修复Lua库中的内部路径
require()
d。。。我也不知道从单元测试的角度来看这是如何工作的。我做错了什么?我认为最干净的解决方案是让库保持原样,然后让使用库的人负责正确配置包.path
。在您的设置中,这意味着应用程序应将lib文件夹添加到路径:
package.path = './lib/?.lua;' .. package.path
有关路径的更多信息,请参见相关问题,如以及。Yes;或者,将lib安装在Lua默认路径的目录中,如
/usr/local/share/Lua/5.1/
package.path = './lib/?.lua;' .. package.path