为什么lua 5.4默认不从当前目录加载模块?

问题描述 投票:0回答:1

我在这里看到多个问题,这意味着从当前目录加载模块应该是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 似乎没有说这个改变。

lua
1个回答
0
投票

这里的问题是

package.path
的默认值被
LUA_PATH
环境变量覆盖,并且它的值不包括
./?.lua

手册中提到,如果您想在环境变量中包含默认搜索路径,您可以在其后面附加

;;
,例如:

C:\lua\systree\share\lua\5.4\?.lua;C:\lua\systree\share\lua\5.4\?\init.lua;;
© www.soinside.com 2019 - 2024. All rights reserved.