我对Lua很新,我对导入机制有些问题 从其他语言我习惯做这样的事情:
include "./lib/mylib.h"
或者通常只是将本地路径传递给我想要包含的文件。
现在在Lua,我有点困惑。我读到了require
在lua路径中查找库的一些内容
在我的情况下,我想创建一个使用luasocket库的脚本,但我想从本地路径导入它,以便我可以部署它而无需在lua路径中的另一台机器上。
在其他论坛中,我得到了一些解决方案,比如创建一个local
require函数,该函数在给定的本地库文件夹中查找但不起作用。
然后我读到我可以输入require 'myfile'
来导入本地不同的文件,但luasocket需要一个core.dll,如果我只是将库的lua文件移动到我的本地路径,它就找不到DLL。
有没有一种简单的方法可以解决这个问题。我需要做些什么来实现这个目标?
答案 0 :(得分:1)
.dll扩展名在LUA_CPATH
内就足够了(因此最终会在package.cpath
中)。例如,将socket.lua
放入C:\Foo
,并将core.dll
放在同一文件夹中。然后require 'socket'
将失败:
> print(package.cpath)
.\?.dll;.\?51.dll;C:\Program Files\Lua\5.1\?.dll;C:\Program Files\Lua\5.1\?51.dl
l;C:\Program Files\Lua\5.1\clibs\?.dll;C:\Program Files\Lua\5.1\clibs\?51.dll;C:
\Program Files\Lua\5.1\loadall.dll;C:\Program Files\Lua\5.1\clibs\loadall.dll
> print(package.path)
;.\?.lua;C:\Program Files\Lua\5.1\lua\?.lua;C:\Program Files\Lua\5.1\lua\?\init.
lua;C:\Program Files\Lua\5.1\?.lua;C:\Program Files\Lua\5.1\?\init.lua;C:\Progra
m Files\Lua\5.1\lua\?.luac
> require 'socket'
.\socket.lua:13: module 'socket.core' not found:
-- look for preload
no field package.preload['socket.core']
-- look for .lua in socket folder anywhere on package.path:
no file '.\socket\core.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket\core.lua'
no file 'C:\Program Files\Lua\5.1\lua\socket\core\init.lua'
...
-- look for .luac in socket folder anywhere on package.path:
no file 'C:\Program Files\Lua\5.1\lua\socket\core.luac'
-- look for .dll in socket folder anywhere on package.cpath:
no file '.\socket\core.dll'
no file '.\socket\core51.dll'
no file 'C:\Program Files\Lua\5.1\socket\core.dll'
no file 'C:\Program Files\Lua\5.1\socket\core51.dll'
no file 'C:\Program Files\Lua\5.1\clibs\socket\core.dll'
no file 'C:\Program Files\Lua\5.1\clibs\socket\core51.dll'
...
stack traceback:
[C]: in function 'require'
.\socket.lua:13: in main chunk
[C]: in function 'require'
stdin:1: in main chunk
[C]: ?
因为socket.lua
需要socket.core
,所以Lua解释器会在core.lua
的任何位置的“socket”文件夹中查找package.path
,但找不到它(套接字文件夹不会'存在),然后在core.dll
上的socket
文件夹中查找package.cpath
,同样的问题。
现在创建C:\Foo\socket
文件夹,然后将core.dll
移动到该文件夹,然后require 'socket'
将起作用(从解释程序启动时,cd到C:\Foo
)。
在您的情况下,如果yourLuaScript.lua
中有C:\Foo
,则socket.lua
位于同一文件夹中,core.dll
位于C:\Foo\socket
,{{1}只要yourLuaScript.lua
包含require 'socket'
,package.path
包含.\*.lua
,您就可以package.cpath
运行.\*.dll
。