我试图让一个 lua 文件需要另一个。我正在遵循本指南:http : //lua-users.org/wiki/ModulesTutorial
我的基本测试,应该是一个微不足道的 hello world,不起作用,我不知道为什么。
这是一个显示所有文件和所有错误的控制台日志:
C:\Users\TestUser\Desktop\LuaTest>dir
Volume in drive C has no label.
Volume Serial Number is XXXX-XXXX
Directory of C:\Users\TestUser\Desktop\LuaTest
11/15/2017 03:03 PM <DIR> .
11/15/2017 03:03 PM <DIR> ..
11/15/2017 02:53 PM <DIR> Bar
11/15/2017 03:04 PM 92 BazModule.lua
11/15/2017 02:53 PM <DIR> Foo
11/15/2017 03:08 PM 139 main.lua
2 File(s) 231 bytes
4 Dir(s) 253,774,073,856 bytes free
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 Copyright (C) 1994-2012 Lua.org, PUC-Rio
Run Code Online (Sandbox Code Playgroud)
预期的输出应该是
Hello Baz!
Hello Bar!
Hello Foo!
Run Code Online (Sandbox Code Playgroud)
但它找不到与 main.lua 相邻的任何文件,我不明白为什么。
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'
Run Code Online (Sandbox Code Playgroud)
表示require搜索到的路径。似乎package.path是完全空的,或者那里可能有一个格式错误的路径模式。(这将是C:\dev\LuaDist\bin。)
在一个模块的搜索方式foo.bar的工作原理是?通过取代foo/bar(或foo\bar-取决于OS)等./?.lua会发现./foo/bar.lua。
所以解决这个问题的方法是(a)修复你(或你安装的东西)正在/正在破坏package.path(通过环境变量,启动脚本,......?)和/或(b)将当前目录添加到搜索路径。