lua - primavera - hashtags mas seguidos en instagram
Cargar archivos Lua por ruta relativa (4)
Si tengo una estructura de archivos como esta:
./main.lua
./mylib/mylib.lua
./mylib/mylib-utils.lua
./mylib/mylib-helpers.lua
./mylib/mylib-other-stuff.lua
Desde main.lua
el archivo mylib.lua
se puede cargar con la ruta completa require(''mylib.mylib'')
. Pero dentro de mylib.lua
también me gustaría cargar otros módulos necesarios y no tengo ganas de especificar siempre la ruta completa (por ejemplo, mylib.mylib-utils
). Si alguna vez decido mover la carpeta, voy a tener una gran cantidad de búsqueda y reemplazo. ¿Hay alguna forma de usar solo la parte relativa del camino?
UPD. Estoy usando Lua con Corona SDK, si eso importa.
Bajo el entorno Lua de Conky, he logrado incluir mi common.lua
(en el mismo directorio) que require(".common")
. Tenga en cuenta el punto inicial .
personaje.
Estoy usando el siguiente fragmento de código. Debería funcionar tanto para los archivos cargados con require
, como para los archivos llamados a través de la línea de comandos. Luego use requireRel
lugar de require
para aquellos que desea que se carguen con una ruta relativa.
local requireRel
if arg and arg[0] then
package.path = arg[0]:match("(.-)[^///]+$") .. "?.lua;" .. package.path
requireRel = require
elseif ... then
local d = (...):match("(.-)[^%.]+$")
function requireRel(module) return require(d .. module) end
end
Hay una manera de deducir la "ruta local" de un archivo (más concretamente, la cadena que se utilizó para cargar el archivo).
Si necesita un archivo dentro de lib.foo.bar
, puede estar haciendo algo como esto:
require ''lib.foo.bar''
Luego, puede obtener la ruta al archivo como la primera variable de elemento (y única) ...
cuando está fuera de todas las funciones. En otras palabras:
-- lib/foo/bar.lua
local pathOfThisFile = ... -- pathOfThisFile is now ''lib.foo.bar''
Ahora, para obtener la "carpeta" debe eliminar el nombre del archivo. La forma más sencilla es usar match:
local folderOfThisFile = (...):match("(.-)[^%.]+$") -- returns ''lib.foo.''
Y ahí lo tienes. Ahora puede anteponer esa cadena a otros nombres de archivos y usar eso para requerir:
require(folderOfThisFile .. ''baz'') -- require(''lib.foo.baz'')
require(folderOfThisFile .. ''bazinga'') -- require(''lib.foo.bazinga'')
Si mueve bar.lua
, folderOfThisFile
se actualizará automáticamente.
Tu puedes hacer
package.path = ''./mylib/?.lua;'' .. package.path
O
local oldreq = require
local require = function(s) return oldreq(''mylib.'' .. s) end
Entonces
-- 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