假设我有一个项目文件夹,例如:
mxn:lab axn$ tree .
.
├── lib
│ ├── a.lua
│ └── b.lua
└── main.lua
哪里main.lua
:
require("lib.a")
并在a.lua
我只使用字符串 "b"
,试图告诉 lua - 找到一个名为 b.lua
的文件在 a.lua
的同一文件夹中第一:
require("b")
和b.lua
:
print('b loaded!')
然后我运行命令 lua main.lua
并得到错误:
[Running] lua "/Users/axn/lab/main.lua"
lua: ./lib/a.lua:1: module 'b' not found:
no field package.preload['b']
no file './b.lua'
no file '/usr/local/share/lua/5.1/b.lua'
no file '/usr/local/share/lua/5.1/b/init.lua'
no file '/usr/local/lib/lua/5.1/b.lua'
no file '/usr/local/lib/lua/5.1/b/init.lua'
no file './b.so'
no file '/usr/local/lib/lua/5.1/b.so'
no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
[C]: in function 'require'
./lib/a.lua:1: in main chunk
[C]: in function 'require'
/Users/axn/lab/main.lua:1: in main chunk
[C]: ?
我知道像 package.path = package.path..';'..'lib/?.lua'
这样的解决方案,但是如果结构更改为:
.
├── foo
│ └── lib
│ ├── a.lua
│ └── b.lua
└── main.lua
我不想再次修改 package.path。不管结构是什么,require("b")
在 a.lua
总是让lua去搜索b
在 a.lua
的同一文件夹中首先。
最佳答案
与其重写 require
并影响所有代码的行为,不如为此目的创建一个特殊函数:
--Utility function for Lua 5.1, which table.pack can do in 5.2+
function pack_params(...)
return {n = select("#", ...), ...}
end
local curr_local_path = ""
function require_local_path(local_path, ...)
--Store the old paths on the stack.
local old_path = package.path
local old_local_path = curr_local_path
--Build the new search path and add it to the front of the package.path.
curr_local_path = curr_local_path .. local_path
package.path = "./" .. curr_local_path .. "?.lua;" .. package.path
--Perform the require, storing the results temporarily.
local rets = pack_params(require(...))
--Fix the prior paths.
package.path = old_path
curr_local_path = old_local_path
return unpack(rets, 1, rets.n)
end
请注意,此函数会强制您将本地路径与所需模块的名称分开。给定的 local_path
对于最近的 require_local_path
嵌套调用总是期望是本地的。它也应该以 /
目录分隔符结束。
如果您绝对必须给它一个字符串而不是一个单独的路径,我相信您可以编写一个版本,将给定的模块拆分为一个基本名称和一个本地路径。
关于lua - 如何制作与首先调用 require 的模块位于同一文件夹中的 lua 搜索模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61044910/