Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Load Lua-files by relative path

If I have a file structure like this:

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

From main.lua the file mylib.lua can be loaded with full path require('mylib.mylib'). But inside mylib.lua I would also like to load other necessary modules and I don't feel like always specifying the full path (e.g. mylib.mylib-utils). If I ever decide to move the folder I'm going to have a lot of search and replace. Is there a way to use just the relative part of the path?

UPD. I'm using Lua with Corona SDK, if that matters.

like image 822
RocketR Avatar asked Feb 04 '12 23:02

RocketR


2 Answers

There is a way of deducing the "local path" of a file (more concretely, the string that was used to load the file).

If you are requiring a file inside lib.foo.bar, you might be doing something like this:

require 'lib.foo.bar' 

Then you can get the path to the file as the first element (and only) ... variable, when you are outside all functions. In other words:

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

Now, to get the "folder" you need to remove the filename. Simplest way is using match:

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

And there you have it. Now you can prepend that string to other file names and use that to require:

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

If you move bar.lua around, folderOfThisFile will get automatically updated.

like image 53
kikito Avatar answered Sep 17 '22 11:09

kikito


You can do

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

Or

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

Then

-- 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 
like image 28
Seth Carnegie Avatar answered Sep 16 '22 11:09

Seth Carnegie