Lua require 不起作用

我试图让一个 lua 文件去 require 另一个 lua 文件。我在按照以下指南进行操作:http://lua-users.org/wiki/ModulesTutorial

我的基本测试,应该是一个微不足道的 hello world,无法工作,我无法弄清为什么。

这里有一个控制台日志,显示所有文件和所有错误:

C:\Users\TestUser\Desktop\LuaTest>dir
 驱动器 C 中的卷没有标签。
 卷的序列号是 XXXX-XXXX

 C:\Users\TestUser\Desktop\LuaTest 的目录

2017/11/15  下午 03:03    <DIR>          .
2017/11/15  下午 03:03    <DIR>          ..
2017/11/15  下午 02:53    <DIR>          Bar
2017/11/15  下午 03:04                92 BazModule.lua
2017/11/15  下午 02:53    <DIR>          Foo
2017/11/15  下午 03:08               139 main.lua
               2 个文件            231 字节
               4 个目录 253,774,073,856 可用字节

C:\Users\TestUser\Desktop\LuaTest>lua main.lua
lua: main.lua:1: module 'BazModule' not found:
        no field package.preload['BazModule']
        no file 'C:\dev\LuaDist\bin'
        no file '.\BazModule.dll'
        no file 'C:\dev\LuaDist\bin\..\lib\lua\BazModule.dll'
        no file 'C:\dev\LuaDist\bin\..\lib\lua\loadall.dll'
stack traceback:
        [C]: in function 'require'
        main.lua:1: in main chunk
        [C]: ?

C:\Users\TestUser\Desktop\LuaTest>type main.lua
local baz = require("BazModule")
baz.Baz()

local bar = require("Bar.BarModule")
bar.Bar()

local foo = require("Foo.FooModule")
foo.Foo()

C:\Users\TestUser\Desktop\LuaTest>type BazModule.lua
local BazModule = {}

function BazModule.Baz()
    print("Hello Baz!")
end

return BazModule

C:\Users\TestUser\Desktop\LuaTest>lua -v
Lua 5.1.5  版权所有 (C) 1994-2012 Lua.org, PUC-Rio

预期输出应该是:

Hello Baz!
Hello Bar!
Hello Foo!

但它找不到与 main.lua 相邻的任何文件,我不明白为什么。

点赞
用户805875
用户805875

require 在列于 package.path 目录下搜索 Lua 文件,同时在 package.cpath 目录下搜索编译好的库文件。

你的错误信息是这样的:

lua: main.lua:1: module 'BazModule' not found:
        no field package.preload['BazModule']
        no file 'C:\dev\LuaDist\bin'
        no file '.\BazModule.dll'
        no file 'C:\dev\LuaDist\bin\..\lib\lua\BazModule.dll'
        no file 'C:\dev\LuaDist\bin\..\lib\lua\loadall.dll'

它指示了 require 搜索的路径。看起来,package.path完全空的,或者里面只包含一个格式错误的路径模式。(可能是 C:\dev\LuaDist\bin。)

搜索模块 foo.bar工作方式是:

  • ?foo/bar 替代(在不同的操作系统上可能是 foo\bar)。
  • 因此,./?.lua 可以找到 ./foo/bar.lua

要解决这个问题,可以(a)修复导致 package.path 被篡改的位置(可能是通过环境变量、启动脚本等方式),或者(b)将当前目录添加到搜索路径中。

2017-11-15 23:51:43