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

问题描述

我设法安装了luasocket并使用lua5.3可以正常工作,但是我找不到从luajit进行安装的方法

如果我写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 -- copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON ARMv7 VFPv3 fold 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]: in function 'require'
        stdin:1: in main chunk
        [C]: at 0xaba4406d

我尝试将已安装的文件移至其中一些路径,但仍然无法正常工作。

解决方法

luarocks --lua-version 5.1 install luasocket

是正确的安装方式。

这也应该在输出的最后一行告诉您模块的安装位置,以便您可以检查它是否在package.path中。


似乎您只是误解了package.path的工作方式。来自manual

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

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

通常 Luarocks应该在/usr/local/share/lua/5.1/socket.lua处安装软件包的主Lua文件,但是对于您而言,这似乎不起作用。您可以查看该目录并查看文件是否存在,然后检查luarocks config deploy_lua_dir是否实际返回/usr/local/share/lua/5.1

,

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

找到安装了socket.lua的位置,查找或定位(如果已安装):

WEB-INF

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

编辑您的.bashrc-在这里假设一个bash shell,但是其他人遵循类似的过程。选择,然后进行相应的https://wiki.termux.com/wiki/Shells

修改

找到显示/usr/share/lua/5.3/socket.lua

的行

添加分号和从上方找到的路径。

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'

我不喜欢这种次要的软链接方法,因为您必须为路径之外的每个Lua模块执行此操作,但是我将其包括在内,以便您知道自己的选择。如果仅用于特定模块,这将是一个可以接受的解决方案,因为它可以完成您打算要做的事情。但是,将来当您遇到与其他模块相同的问题时,您也将不得不重复这些过程。最好修改LUA_PATH。

,

这就是你所说的:

“我添加路径并获得:/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兼容的套接字位置,并将其添加到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。如此
与/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