[英]How to install modules to Luajit using Luarocks
我设法安装了 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
我尝试将已安装的文件移动到其中一些路径,但仍然无法正常工作。
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,但其他人遵循类似的过程。 选择,并相应地修改https://wiki.termux.com/wiki/Shells
找到说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 是您最好的选择。
luarocks --lua-version 5.1 install luasocket
是安装它的正确方法。
这也应该在输出的最后一行告诉您它安装模块的位置,因此您可以检查它是否在您的package.path
。
看来您只是误解了package.path
工作原理。 从手册:
路径是包含由分号分隔的模板序列的字符串。 对于每个模板,该函数将模板中的每个询问标记(如果有)替换为 name 的副本,其中所有出现的 sep(默认情况下为点)都替换为 rep(默认情况下系统的目录分隔符),然后尝试打开生成的文件名。
这意味着像/usr/share/lua/5.1
这样的路径不会找到任何东西,因为它在该路径上找不到有效的 Lua 文件,并且因为没有?
,不进行任何替换。 两个路径中的第一个是可以的,但是许多 Lua 模块使用一个名为init.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
。
事情是这样的,你说:
“我添加路径并得到: /data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket.lua module 'socket.core' not found...”
那是因为 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 相对。 卢阿
在这种情况下,使用我前面提到的软链接方法,确保使用正确的位置,这只是一个例子:
ln -s /usr/local/lib/lua/5.1/socket.lua /usr/local/lib/lua/5.1/socket.so
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.