问题描述
我设法安装了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