如何解决如何相对于当前加载的脚本加载lua脚本?
我正在加载一个lua脚本,该脚本试图导入辅助lua脚本。问题是我在C ++中加载了初始脚本(Main.lua)并指定了该Lua的路径,然后当Main.lua尝试在“ Other.lua”上运行dofile时,找不到它了...
我知道...
无法打开Other.lua:没有此类文件或目录
main.cpp
#include "sol.hpp"
int main()
{
sol::state m_lua;
m_lua.open_libraries(sol::lib::base);
sol::protected_function_result result = m_lua.script_file("../../../Desktop/Main.lua");
if (!result.valid())
{
sol::error err = result;
std::string what = err.what();
std::cout << "Failed to load script: Test.lua - " << what << std::endl;
}
}
}
Main.lua
print("Main Loaded");
dofile("Other.lua");
Other.lua-与“ Main.lua”存储在同一文件夹中
print("Other Loaded");
解决方法
只需将Main.lua
的路径传递到应该从C ++加载Other.lua
脚本的路径,然后将其前置到文件名,然后再传递给Lua中的dofile
。
如果您使用的是LuaRocks,则您的配置可能会覆盖lua的路径默认配置,这会导致问题(它经常发生,确实如此)
关于如何处理此问题,没有任何好的指南,而随着Lua的发展,您将面临此类问题,因此我不得不为您和可能遇到此类问题的其他人写这篇文章问题。
您可以采取许多步骤来解决此问题(嵌套的相对导入可能是疯狂的举动)
-
您只需将当前路径分配给
package.path
package.path = package.path .. ';' .. ('./?.lua')
package.path = package.path .. ';' .. ('./?/init.lua')
.
是当前目录,并且?
被您传递给require()
的脚本名称所代替,这样,它也将不得不在当前目录中进行搜索
在某些项目中,您将必须管理从嵌套文件夹的导入,甚至是从后面文件夹的导入
Lua使得管理导入特别困难,例如,如果您在根文件夹中已经需要的脚本中使用了require
,则您将不得不索引要从根开始加载的脚本文件夹
您也可以执行以下操作来代替require(libs.classes.functions.public.dev.MyFunction)
之类的东西:
-
如果脚本是从已经嵌套的脚本中导入的,则可以在脚本的根目录中使用
(...)
来获取导入的路径(仅在Lua 5.1及更高版本中)> current_path = (...)
将基于相对路径(如果脚本已经嵌套)等于当前脚本的路径它将返回类似于以下内容的内容:
root.lib.classes.currentscriptname
姓氏将等于使用
(...)
的脚本名称。 -
如果要从脚本当前文件夹中导入,请使用
(...):match('(.-)[^%.]+$')
,这将允许您从当前脚本的父目录(即当前脚本所在的文件夹)中进行导入,不是主脚本所在的位置。所以:
BASE = (...):match('(.-)[^%.]+$')
,然后require(BASE .. 'myLib')
将从保存当前脚本的文件夹中导入myLib
。
例如,假设您运行了位于main.lua
的{{1}},然后导入了位于main/
的名为loader.lua
的脚本,假设您要加载两个脚本:
-
位于
- assets.lua 位于
- bullet.lua
main/lib/classes
上的main/lib
上的您可以执行以下操作:
在您的main.lua脚本中:
main/lib/classes
在您的loader.lua脚本中:
-- main.lua
-- From Lua 5.1 and above
-- Since this script is not nested
-- this will only contain the name of the current script (without '.lua'),which is "main"
local CURRENT_PATH = (...)
LIBS_PATH = CURRENT_PATH .. '.lib' -- This will hold "main.lib"
这将使您可以轻松地从-- loader.lua
-- From Lua 5.1 and above
-- This will contain "main.lib.classes.",which already has a dot at the end
local CURRENT_PATH = (...):match('(.-)[^%.]+$')
-- SCRIPT_PATH will contain "main.lib.classes.loader"
local SCRIPT_PATH = (...)
-- Import from main/lib/assets.lua
local assets = require(LIB_PATH .. '.assets')
-- Import from current directory (main/lib/classes)
local bullet = require(BASE .. 'assets')
加载两个脚本,而不必花费不必要的时间。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。