Lua Nested Require Path - PullRequest
       44

Lua Nested Require Path

0 голосов
/ 29 ноября 2018

Я пишу инструмент для анализа плагинов lua, созданных другими пользователями.Единственная гарантия в отношении плагина заключается в том, что у него есть файл data.lua в известной директории.Там пользователи могут делать все, что пожелают.Этот конкретный плагин требует, чтобы загрузить файл, и этот файл загружает другой файл.Оба являются относительными путями, но второй относится к местоположению первого файла.

  • data.lua
  • foo / bar.lua
  • foo / baz.lua

data.lua:

require("foo.bar")

foo / bar.lua:

require("baz")

Когда я пытаюсь выполнить data.lua, я получаю ошибкукогда foo / bar.lua пытается запросить «baz».Ни один из путей, которые он пробует, не является ./foo/.

Есть идеи, как я могу это исправить?Я мог найти любую документацию конкретно по этому делу, казалось, что мне нужно жестко кодировать / foo / в путь, но я не знаю об этом заранее.Это похоже на то, что должно быть автоматическим. Есть ли настройка, которую я пропускаю, или я использую неправильную версию lua?Я использую NLua 4.0

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 декабря 2018

Я протестировал этот скрипт, используя node-lua, и он исправляет проблему для меня!

https://gist.github.com/hoelzro/1299679

Код Relavent:

local oldrequire = require

function require(modname)
  local regular_loader = package.loaders[2]
  local loader = function(inner)
    if string.match(modname, '(.*)%.') then
      return regular_loader(string.match(modname, '(.*)%.') .. '.' .. inner)
    end
  end

  table.insert(package.loaders, 1, loader)
  local retval = oldrequire(modname)
  table.remove(package.loaders, 1)

  return retval
end

Чтобы получить этоработать с Lua 5.2, поменяйте все виды использования package.loaders на package.searchers.

Также, если вы хотите переопределить глобальную функцию require, вам также понадобится этот фрагмент:

_G.require = require
0 голосов
/ 23 декабря 2018

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

Ресурсы на package.path:

https://www.lua.org/manual/5.3/manual.html#pdf-package.path

http://lua -users.org / wiki / PackagePath

Пример добавления папки foo в места поиска:

package.path = package.path .. ';./foo/?.lua'

где ? будет символстрока, переданная по запросу, помещается.


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

package.path = package.path .. ';./nested_require.lua' 

Затем определите поведение, которое вы хотели бы вэтот файл.Вы можете использовать глобальную переменную _REQUIREDNAME для ссылки на значение, переданное функции require.

Документация для этого метода находится здесь внизу страницы: https://www.lua.org/pil/8.1.html

...