Lua 从本地路径导入库(luasocket)

我对 Lua 还很陌生,我在使用导入机制时遇到了一些问题。在其他语言中,我习惯这样做:

include "./lib/mylib.h"

或者只是将本地路径传递给我想要包含的文件。现在在 Lua 中,对我来说有点困惑。我看过一些关于 require 在 lua 路径中查找库的内容。在我的情况下,我想创建一个使用 luasocket 库的脚本,但我想从本地路径导入它,以便在不需要将它放在另一台机器的 Lua 路径中的情况下进行部署。我从其他论坛得到的解决方案是创建一个 local require 函数,它会查找给定的本地库文件夹,但这并没有起作用。然后我读到可以只键入 require 'myfile' 来本地导入不同的文件,但 luasocket 需要一个 core.dll,如果我只是将库的 lua 文件移动到本地路径,它就找不到 dll 了。是否有简单的方法来解决这个问题?我该怎么做才能让它正常工作呢?

点赞
用户869951
用户869951

LUA_CPATH 中有 .dll 扩展名就足够了(它最终将出现在 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 解释器在 package.path 上的 "socket" 文件夹中查找 core.lua,因为文件夹不存在,所以找不到,然后在 package.cpath 上的 socket 文件夹中查找 core.dll,仍然找不到。

现在创建 C:\Foo\socket 文件夹,将 core.dll 移动到其中,然后 require 'socket' 将工作(从 cd 到 C:\Foo 的解释器中启动)。

在您的情况下,如果您将 yourLuaScript.lua 放在 C:\Foo 中,则可以在同一文件夹中将 socket.lua 放在其中,将 core.dll 放在 C:\Foo\socket 中,并且 yourLuaScript.lua 可以 require 'socket',只要 package.path 包含 .\*.lua,并且 package.cpath 包含 .\*.dll,您将能够运行 yourLuaScript.lua

2014-01-23 03:36:41