Как установить модули в Luajit с помощью 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

Я попытался переместить установленные файлы по некоторым из этих путей, но все равно не работает.


person String Manolo    schedule 10.11.2020    source источник


Ответы (3)


socket.lua был установлен в каталог, которого нет в вашем LUA_PATH

найдите, где был установлен socket.lua, с помощью find или mlocate, если он установлен:

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, но другие следуют аналогичному процессу. сделайте свой выбор и измените соответствующим образом 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.

person Doyousketch2    schedule 10.11.2020
comment
find / -name socket.lua 2›&1 | grep -v Perm sudo updatedb && locate socket.lua эти команды ничего не возвращают. Во всяком случае я знаю, где установлен. Я попытался скопировать все пути, которые ищет luajit, но не работает. - person String Manolo; 10.11.2020
comment
Не копируйте все пути, которые Lua уже ищет — это избыточно. Просто добавьте путь, по которому находится socket.lua. Вероятно, вы уничтожили его установку, пытаясь переместить этот модуль в другой каталог. luarocks remove luasocket и любые другие экземпляры socket.lua, для обнаружения которых вам нужно научиться использовать find или locate, а затем переустановить luasocket. - person Doyousketch2; 10.11.2020
comment
С LUA_PATH вы можете использовать двойную точку с запятой ;; и Lua просто вставит туда путь по умолчанию. - person DarkWiiPlayer; 13.11.2020
comment
Это не проблема. StringManolo уже указал в исходном вопросе, что stdin:1: module 'socket' not found:, а затем список всех местоположений по умолчанию, которые он ищет. - person Doyousketch2; 13.11.2020

luarocks --lua-version 5.1 install luasocket

это правильный способ установить его.

Это также должно указать вам в последней строке вывода, где он установил модуль, чтобы вы могли проверить, находится ли он в вашем package.path.


Кажется, вы просто неправильно понимаете, как работает package.path. Из руководства:

Путь — это строка, содержащая последовательность шаблонов, разделенных точкой с запятой. Для каждого шаблона функция заменяет каждый вопросительный знак (если есть) в шаблоне копией имени, в которой все вхождения sep (точка по умолчанию) были заменены 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.

person DarkWiiPlayer    schedule 10.11.2020
comment
Я добавляю путь перед запросом и получаю: 'socket.core'] нет файла '/data/data/com.termux/files/home/.luarocks/share/lua/5.1/socket/core.lua' - person String Manolo; 10.11.2020
comment
Попробуйте luarocks list --lua-version 5.1 socket, это скажет вам, в каком каменном дереве он установлен. - person DarkWiiPlayer; 11.11.2020
comment
Я пробовал все. То же самое происходит с модулями в текущей папке. Я не могу найти способ сделать require не бесполезным. io.read работает нормально. Теперь я пытался включить файл в подпапку проекта и снова застрял. Я даже пытался использовать os.execute(pwd › currentpath), читать этот файл и добавлять путь в package.path. Просто продолжайте говорить, что не может найти модуль. - person String Manolo; 12.11.2020
comment
lua5.3: server.lua:36: модуль '/data/data/com.termux/files/home/storage/downloads/SERVER/services/lua/config/static_headers.config' не найден. Это полный путь, и файл, очевидно, существует. Я могу запустить файл, используя этот путь. - person String Manolo; 12.11.2020
comment
Ах, я только что заметил кое-что о вашем коде. Обновляю свой ответ сейчас @StringManolo - person DarkWiiPlayer; 13.11.2020

Вот в чем дело, вы заявили:

Я добавляю путь и получаю: /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.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
person Doyousketch2    schedule 13.11.2020
comment
Я думаю, что это ошибка core.lua в версии luasocket 5.1. - person String Manolo; 13.11.2020