LINUX.ORG.RU

Как подключать локальные пакеты?

 


0

1

Здравствуйте.

Прочитал мануал, PIL, Stackoverflow, но так и не понял как подключить lua-пакет, лежащий рядом с main.lua

Пример. main.lua:

hello = require("hello")
print(hello)

hello.lua:

return "hello"

Запускаю lua main.lua находясь в директории, где находится main.lua - работает

Перехожу в другую директорию, запускаю lua /home/makoven/main.lua - вылетает с ошибкой «module 'hello' not found»

★★★★★

Последнее исправление: makoven (всего исправлений: 1)

Пока что обжодусь вот таким вот костылём. Может можно как-нибудь попроще?

runscript.sh:

#!/bin/sh
set -e

APP_FILE=$(readlink -fns $0)
APP_DIR=$(dirname $APP_FILE)

LUA_PATH="$APP_DIR/?.lua;;" lua $APP_DIR/main.lua

makoven ★★★★★
() автор топика
Последнее исправление: makoven (всего исправлений: 3)

Я не вполне понимаю, как оно у тебя вообще может работать, если ты пишешь require("hello"), а файл называется pkg.lua. Ты, наверное, пишешь require("pkg")

Lua, как я понимаю, не ищет ничего в директории с файлом, а ищет только в текущей директории. Тебе придётся вычислять нужный путь и добавлять его в package.path или свой загрузчик в package.searchers (см. reference manual).

proud_anon ★★★★★
()
Последнее исправление: proud_anon (всего исправлений: 1)
Ответ на: комментарий от proud_anon

Я не вполне понимаю, как оно у тебя вообще может работать, если ты пишешь require(hello), а файл называется pkg.lua. Ты, наверное, пишешь require(«pkg»)

Поправил

Lua, как я понимаю, не ищет ничего в директории с файлом, а ищет только в текущей директории.

Я тоже так понимаю. Но была надежда, что понимаю я неправильно

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Lua, прежде всего, встраиваемый язык, поэтому это в целом логично. Текущая директория у программы одна, а скрипты-то могут лежать где угодно.

proud_anon ★★★★★
()

Как вариант

package.path = (debug.getinfo(1).source:match("@(.*)/") or "") .. "/?.lua;" .. package.path
Недостатки: 1. в случае lua test.lua в package.path будет
/?.lua;/usr/...
2. Не работает в виндовс

at ★★
()
Ответ на: комментарий от at

Очень интересное решение s debug.getInfo. Жаль что не работает когда скрипт оформлен как исполняемый (с #!/bin/lua в начале), лежит в $PATH и вызывается по имени из произвольной директории :)

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

хм... у меня работает, в package.path /home/user/bin/?.lua;....

user@TEST-KVM:~$ ls ~/bin/*.lua
/home/user/bin/hello.lua  /home/user/bin/luatest.lua
user@TEST-KVM:~$ cat ~/bin/luatest.lua
#! /usr/bin/lua

package.path = (debug.getinfo(1).source:match("@(.*)/") or "") .. "/?.lua;" .. package.path

print(package.path)

hello = require("hello")
print(hello)

user@TEST-KVM:~$ lua -v
Lua 5.2.1  Copyright (C) 1994-2012 Lua.org, PUC-Rio

P.S. Хотя, ИМХО, в таком случае либы должны лежать в другом месте.

at ★★
()
Последнее исправление: at (всего исправлений: 1)
Ответ на: комментарий от at

Естественно, всё лежит в отдельной директории, а в PATH добавлен симлинк на исполняемый файл. Хотя, наверное никакой другой язык не решает подобных ребусов по нахождению локальной директории скрипта

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

никакой другой язык не решает подобных ребусов по нахождению локальной директории скрипта

Это возможно, конкретно для lua есть LuaFileSystem и luaposix, но, ИМХО, в данном случае проще создать шеловский скрипт, который устанавливает переменные окружения и т.д.

at ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.