如何使用Luarocks将模块安装到Luajit

我设法使用lua5.3安装了luasocket,并且正常工作,但我找不到安装它们以从luajit中require的方法。

如果我编写print(_VERSION),它显示luajit使用lua5.1。

这是我一直在尝试的内容:

luarocks install luasocket

luarocks --local install luasocket

luarocks --lua-version 5.1 install luasocket

luarocks --lua-version 5.1 --local install luasocket

luarocks config lua_version 5.1

luarocks install luasocket

sock = require("/data/data/com.termux/files/home/.luarocks/lib/luarocks/rocks-5.1/socket")

package.path = package.path .. ";/data/data/com.termux/files/home/.luarocks/lib/luarocks/rocks-5.1" require "socket"

package.path = package.path .. ";/data/data/com.termux/files/home/.luarocks/lib/lua/5.1" require "socket"

...

错误信息:

$ luajit
LuaJIT 2.1.0-beta3 -- 版权所有(C)2005-2017 Mike Pall.http://luajit.org/
JIT: 在ARMv7 VFPv3上折叠cse dce fwd dse narrow loop abc sink fuse
> sock = require("socket")
stdin:1: module 'socket' not found:
        no field package.preload['socket']
        no file './socket.lua'
        no file '/data/data/com.termux/files/usr/share/luajit-2.1.0-beta3/socket.lua'
        no file '/usr/local/share/lua/5.1/socket.lua'
        no file '/usr/local/share/lua/5.1/socket/init.lua'
        no file '/data/data/com.termux/files/usr/share/lua/5.1/socket.lua'
        no file '/data/data/com.termux/files/usr/share/lua/5.1/socket/init.lua'
        no file './socket.so'
        no file '/usr/local/lib/lua/5.1/socket.so'
        no file '/data/data/com.termux/files/usr/lib/lua/5.1/socket.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
        [C]:在函数'require'stdin:1:在主要块中
        [C]:在0xaba4406d

我试图将安装的文件移动到其中一些路径,但仍然不起作用。

点赞
用户4984564
用户4984564

下面是安装 luasocket 的正确方式:

luarocks --lua-version 5.1 install luasocket

然后你可以查看输出的最后一行以确定模块的安装位置,以便检查是否在 package.path 中。


看起来您误解了 package.path 的工作方式。来自手册

路径是一个包含模板序列的字符串,模板之间用分号分隔。对于每个模板,函数将模板中的每个问号(如果有的话)都替换为名称的副本,其中已将所有分隔符(默认情况下是点)的所有出现都替换为rep(系统的目录分隔符),然后尝试打开生成的文件名。

这意味着像 /usr/share/lua/5.1 这样的路径将找不到任何东西,因为它在该路径上没有找到有效的 Lua 文件,并且由于没有 ?,因此根本没有进行任何替换。前两个路径都可以,但许多 Lua 模块使用名为 init.lua 的文件,因此对于每个 <path>/?.lua,您应该始终添加一个 <path>/?/init.lua 来覆盖该选项。

luarocks 应该将包的主 Lua 文件安装在 /usr/local/share/lua/5.1/socket.lua,但对于您的情况似乎不起作用。您可以查看该目录并检查该文件是否在那里,以及检查 luarocks config deploy_lua_dir 是否实际返回 /usr/local/share/lua/5.1

2020-11-10 14:15:11
用户3342050
用户3342050

socket.lua被安装到您的LUA_PATH中不存在的目录中

使用find或mlocate找到socket.lua的安装位置(如果已安装):

find / -name socket.lua 2>&1 | grep -v Perm

sudo updatedb  &&  locate socket.lua

~/.luaver/luarocks/3.2.0_5.1/share/lua/5.1/socket.lua

~/.luaver/luarocks/3.2.0_5.3/share/lua/5.3/socket.lua

/usr/share/lua/5.1/socket.lua

/usr/share/lua/5.2/socket.lua

/usr/share/lua/5.3/socket.lua

编辑你的.bashrc——假设你使用的是bash shell,但是其他的shell也可以按照类似的方法操作。找到这一行export LUA_PATH='/usr/local/share/lua/5.1/?.lua;yadda-yadda'并添加一个分号加上你从以上路径找到的路径。

export LUA_PATH='/usr/local/share/lua/5.1/?.lua;/usr/share/lua/5.1'

关闭所有打开的终端,然后打开一个新的终端,现在你已经启用了这个新路径。


或者,你可以使用软链接。

ln -s /usr/share/lua/5.1/socket.lua /usr/local/share/lua/5.1/socket.lua

我不是这种次要软链接方法的粉丝,因为你必须为每个在路径之外的Lua模块这样做,但我包括它是让你知道你的选择。如果只是为了那个特定的模块,这将是一个可接受的解决方案,因为它做到了你想做的事情。然而,在将来当你遇到其他模块的相同问题时,你将不得不重复这个过程。修改LUA_PATH是你最好的选择。

2020-11-10 14:27:19
用户3342050
用户3342050

这是事实,你说:

"我添加路径并得到:/data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket.lua模块'socket.core'未找到..."

那是因为socket.lua存在于该目录中,但你移动了它的子目录:

/data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket/core.lua

所以该目录将不再对你有任何作用,直到你_删除它并重新开始。_

rm /data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket.lua
rm -rf /data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket/

luarocks --lua-version 5.1 install luasocket

现在仔细观察它的安装,看看它实际安装到哪个目录中, 或使用之前提到的find命令来查找与Lua5.1兼容的socket位置并将其添加到您的LUA_PATH中

sudo apt install mlocate  &&  sudo updatedb  &&  locate socket.lua

您不需要将这些目录添加到LUA_PATH中,因为它们已经在搜索中

> sock = require("socket")
stdin:1: module 'socket' not found:
        no field package.preload['socket']
        no file './socket.lua'
        no file '/data/data/com.termux/files/usr/share/luajit-2.1.0-beta3/socket.lua'
        no file '/usr/local/share/lua/5.1/socket.lua'
        no file '/usr/local/share/lua/5.1/socket/init.lua'
        no file '/data/data/com.termux/files/usr/share/lua/5.1/socket.lua'
        no file '/data/data/com.termux/files/usr/share/lua/5.1/socket/init.lua'
        no file './socket.so'
        no file '/usr/local/lib/lua/5.1/socket.so'
        no file '/data/data/com.termux/files/usr/lib/lua/5.1/socket.so'
        no file '/usr/local/lib/lua/5.1/loadall.so'

;;不起作用,因为你已经指出它不驻留在任何这些默认目录中。

很可能它正在寻找正确的目录,但是错误的扩展名。

/usr/local/lib/lua/5.1/socket. so

相对于 /usr/local/lib/lua/5.1/socket. lua

在这种情况下,使用我之前提到的软链接方法,确保使用正确的位置,这只是一个例子:

ln -s /usr/local/lib/lua/5.1/socket.lua /usr/local/lib/lua/5.1/socket.so
2020-11-13 13:10:42