我在这里看到多个问题,这意味着从当前目录加载模块应该是Lua的默认行为。这两个问题请参阅“精选答案”:
但我对 lua54 的经验是它不会:
C:\Code\lua\testcwd>type hello.lua
local function hello()
print("Hello!")
end
return {hello=hello}
C:\Code\lua\testcwd>type use_hello.lua
hello = require("hello")
hello.hello()
C:\Code\lua\testcwd>type use_hello2.lua
-- Util needed by requireLocal()
local function get_directory_path(sep)
local file_path = debug.getinfo(2, "S").source:sub(2)
local dir_path = file_path:match("(.*" .. sep .. ")")
if not dir_path then
dir_path = "." .. sep
end
return dir_path
end
-- Enables calling require for current working directory
local function requireLocal()
local separator = package.config:sub(1,1)
local dir_path = get_directory_path(separator)
package.path = package.path .. ";" .. dir_path .. "?.lua"
end
requireLocal()
hello = require("hello")
hello.hello()
C:\Code\lua\testcwd>lua54 use_hello.lua
lua54: use_hello.lua:1: module 'hello' not found:
no field package.preload['hello']
no file 'C:\lua\systree\share\lua\5.4\hello.lua'
no file 'C:\lua\systree\share\lua\5.4\hello\init.lua'
no file 'C:\lua\systree\lib\lua\5.4\hello.dll'
stack traceback:
[C]: in function 'require'
use_hello.lua:1: in main chunk
[C]: in ?
C:\Code\lua\testcwd>lua54 use_hello2.lua
Hello!
C:\Code\lua\testcwd>lua54 -v
Lua 5.4.2 Copyright (C) 1994-2020 Lua.org, PUC-Rio
为什么“use_hello.lua”不能正常工作?可以清楚地看到它不搜索当前目录。据我所知,我的 PUC lua 5.4 (Windows 10) 配置是“默认”。只是为了从当前目录加载模块,为什么我需要执行“use_hello2.lua”的“疯狂设置”? lua 5.4 改变了吗? 5.4 的 readme 似乎没有说这个改变。
这里的问题是
package.path
的默认值被LUA_PATH
环境变量覆盖,并且它的值不包括./?.lua
。
在手册中提到,如果您想在环境变量中包含默认搜索路径,您可以在其后面附加
;;
,例如:
C:\lua\systree\share\lua\5.4\?.lua;C:\lua\systree\share\lua\5.4\?\init.lua;;