lua - 如何制作与首先调用 require 的模块位于同一文件夹中的 lua 搜索模块?

标签 lua lua-5.1

假设我有一个项目文件夹,例如:

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去搜索ba.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/

相关文章:

c - 在 C 中获取 Lua 表大小

lua-5.1 - 如何使用 C-API 在 Lua 5.1 中的表中创建表?

lua - 在 IRC Bot 中添加 SASL Auth

lua - 如何使用 pandoc lua 过滤器将标题添加为 1 级标题?

visual-studio - 如何引用 .cpp 文件而不将它们包含在 Visual Studio 的解决方案中?

c++ - 在角线上拟合曲线?

floating-point - 将有符号的 IEEE 754 float 转换为十六进制表示

machine-learning - 如何在 Torch 的 GPU 上将张量的元素限制/舍入到小数点后 4 位?

string - 在 Lua 中使用 string.gmatch() 拆分字符串

lua - 使用 LUA 解码 UDP 消息