Загружать Lua-файлы по относительному пути - PullRequest
33 голосов
/ 05 февраля 2012

Если у меня такая файловая структура:

./main.lua
./mylib/mylib.lua
./mylib/mylib-utils.lua
./mylib/mylib-helpers.lua
./mylib/mylib-other-stuff.lua

С main.lua файл mylib.lua может быть загружен с полным путем require('mylib.mylib').Но внутри mylib.lua я также хотел бы загрузить другие необходимые модули, и мне не хочется всегда указывать полный путь (например, mylib.mylib-utils).Если я когда-нибудь решу переместить папку, мне придется много искать и заменять.Есть ли способ использовать только относительную часть пути?

UPD.Я использую Lua с Corona SDK, если это имеет значение.

Ответы [ 4 ]

34 голосов
/ 05 февраля 2012

Существует способ определения «локального пути» файла (точнее, строки, которая использовалась для загрузки файла).

Если вам требуется файл внутри lib.foo.bar, выможет быть что-то вроде этого:

require 'lib.foo.bar'

Тогда вы можете получить путь к файлу в качестве первой (и единственной) переменной ... первого элемента, когда вы находитесь вне всех функций.Другими словами:

-- lib/foo/bar.lua
local pathOfThisFile = ... -- pathOfThisFile is now 'lib.foo.bar'

Теперь, чтобы получить «папку», нужно удалить имя файла.Простейший способ - использовать матч:

local folderOfThisFile = (...):match("(.-)[^%.]+$") -- returns 'lib.foo.'

И вот он у вас.Теперь вы можете добавить эту строку к другим именам файлов и использовать их для запроса:

require(folderOfThisFile .. 'baz')     -- require('lib.foo.baz')
require(folderOfThisFile .. 'bazinga') -- require('lib.foo.bazinga')

Если вы переместите bar.lua, folderOfThisFile автоматически обновится.

15 голосов
/ 05 февраля 2012

Вы можете сделать

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

Или

local oldreq = require
local require = function(s) return oldreq('mylib.' .. s) end

Тогда

-- do all the requires
require('mylib-utils')
require('mylib-helpers')
require('mylib-other-stuff')

-- and optionally restore the old require, if you did it the second way
require = oldreq
0 голосов
/ 20 августа 2016

Я использую следующий фрагмент.Он должен работать как для файлов, загруженных с require, так и для файлов, вызываемых из командной строки.Затем используйте requireRel вместо require для тех, кого вы хотите загрузить с относительным путем.

0 голосов
/ 30 мая 2016

В среде Luky Конки мне удалось включить мой common.lua (в том же каталоге) как require(".common").Обратите внимание на начальную точку . символ.

...