【问题标题】:How to install modules to Luajit using Luarocks如何使用 Luarocks 将模块安装到 Luajit
【发布时间】:2021-02-22 10:12:00
【问题描述】:

我设法安装了 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

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

【问题讨论】:

    标签: lua luajit luarocks luasocket


    【解决方案1】:

    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 是最好的选择。

    【讨论】:

    • find / -name socket.lua 2>&1 | grep -v Perm sudo updatedb && locate socket.lua 这个命令不返回任何东西。反正我知道安装在哪里。我试图复制所有 luajit 正在搜索但不工作的路径。
    • 不要复制 Lua 已经在搜索的所有路径——这是多余的。只需添加socket.lua所在的路径即可。您可能通过尝试将该模块移动到另一个目录来破坏它的安装。 luarocks remove luasocket,以及任何其他 socket.lua 实例,您需要学习如何使用 findlocate 来发现,然后重新安装 luasocket。
    • 使用LUA_PATH,您可以使用双分号;;,Lua 将在那里插入默认路径。
    • 这不是问题。 StringManolo 已经在原始问题中声明了stdin:1: module 'socket' not found:,然后是它正在搜索的所有默认位置的列表。
    【解决方案2】:
    luarocks --lua-version 5.1 install luasocket
    

    是正确的安装方式。

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


    看来您只是误解了package.path 的工作原理。来自manual

    路径是一个字符串,其中包含以分号分隔的模板序列。对于每个模板,该函数将模板中的每个询问标记(如果有)替换为 name 的副本,其中所有出现的 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

    【讨论】:

    • 我在 require 之前添加路径并得到: ...com.termux/files/home/.luarocks/share/lua/5.1/socket.lua:12: module 'socket.core' not找到:没有字段 package.preload['socket.core'] 没有文件'/data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket/core.lua'
    • 试试luarocks list --lua-version 5.1 socket,它会告诉你它安装在什么岩石树上
    • 我尝试了一切。当前文件夹中的模块也是如此。我找不到一种方法使 require 没有用。 io.read 工作正常。现在我一直试图在项目的子文件夹中包含一个文件并再次卡住。我什至尝试使用 os.execute("pwd > currentpath"),读取此文件并将路径添加到 package.path。一直说找不到模块。
    • lua5.3: server.lua:36: 模块'/data/data/com.termux/files/home/storage/downloads/SERVER/services/lua/config/static_headers.config' 不是成立。这是完整路径,文件显然存在。我可以使用此路径对文件进行分类。
    • 啊,我刚刚注意到您的代码。现在更新我的答案@StringManolo
    【解决方案3】:

    事情是这样的,你说:

    “我添加路径得到:/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
    

    【讨论】:

    • 我认为是luasocket 5.1版本的core.lua bug。
    猜你喜欢
    • 2011-10-11
    • 2018-04-10
    • 2019-11-05
    • 2014-08-18
    • 2014-08-25
    • 2015-12-25
    • 2014-02-14
    • 2018-07-22
    • 2014-10-25
    相关资源
    最近更新 更多