如何相对于当前加载的脚本加载lua脚本?

如何相对于当前加载的脚本加载lua脚本?,lua,Lua,我正在加载一个lua脚本,它试图导入一个辅助lua脚本。问题是,我在C++中加载了初始脚本MIN .LUA,并指定了一条路径到这个Lua,然后当MIN。LUA尝试运行其他的DoFILE。LUA它找不到……/P> 我得到 无法打开Other.lua:没有这样的文件或目录 main.cpp Other.lua-存储在与Main.lua相同的文件夹中 只是将Ma.Lua的路径加载到另一个。从C++到Lua脚本,并在将文件传递到Lua上的DoFILE之前将其添加到文件名。 < P>如果使用LoAROCK

我正在加载一个lua脚本,它试图导入一个辅助lua脚本。问题是,我在C++中加载了初始脚本MIN .LUA,并指定了一条路径到这个Lua,然后当MIN。LUA尝试运行其他的DoFILE。LUA它找不到……/P> 我得到

无法打开Other.lua:没有这样的文件或目录

main.cpp

Other.lua-存储在与Main.lua相同的文件夹中


只是将Ma.Lua的路径加载到另一个。从C++到Lua脚本,并在将文件传递到Lua上的DoFILE之前将其添加到文件名。

< P>如果使用LoAROCK,则您的配置可能会覆盖Lua的路径默认配置,这将导致经常发生的问题,确实

关于如何管理这一点,没有任何好的指南,随着Lua的发展,您将面临此类问题,因此我不得不为您和其他可能遇到此类问题的人撰写本文

有很多程序可以用来修复这个嵌套的相对导入,这完全是疯了

您只需将当前路径分配给package.path即可

package.path=package.path.“;”../?。卢亚

package.path=package.path..';..//初始lua'

。是当前目录,并且?替换为您传递给所需的脚本的名称,这样它也必须强制在当前目录中搜索

在某些项目中,您必须管理从嵌套文件夹导入,甚至从后面的文件夹导入

Lua使得管理导入变得特别困难,例如,如果在根文件夹中已经需要的脚本中使用require,则必须从根文件夹开始为要加载的脚本编制索引

除了像requirelibs.classes.functions.public.dev.MyFunction这样的功能外,您还可以执行以下操作:

如果脚本是从已嵌套的脚本导入的,则可以使用。。。在脚本的根目录中,获取仅在Lua5.1及更高版本中导入的路径

>当前路径=。。。如果脚本已嵌套,则将等于基于相对路径的当前脚本的路径

它将返回类似于以下内容的内容: root.lib.classes.currentscriptname

姓氏将等于脚本名,其中。。。被使用了

如果要从脚本当前文件夹导入,请使用…:match.-[^%.]+$”,这将允许您从当前脚本父目录导入,即当前脚本所在的文件夹,而不是主脚本所在的文件夹

因此: 基本=…:匹配'-[^%.]+$',然后匹配requireBASE..'myLib'将从保存当前脚本的文件夹中导入myLib

在本例中,假设您运行main/上的main.lua,然后导入一个名为loader.lua的脚本,该脚本位于main/lib/classes,假设您要加载两个脚本:

assets.lua,位于main/lib bullet.lua,位于main/lib/classes 您可以执行以下操作:

在main.lua脚本中:

-梅因·卢阿 -来自Lua 5.1及以上版本 -因为这个脚本不是嵌套的 -这将只包含当前脚本的名称,而不包含作为main的“.lua” 本地当前路径=。。。 LIBS_路径=当前_路径..'。lib'-这将保存main.lib 在loader.lua脚本中:

-卢阿 -来自Lua 5.1及以上版本 -这将包含main.lib.classes.,它的末尾已经有一个点 本地当前路径=…:匹配'-[^%.]+$' -脚本路径将包含main.lib.classes.loader 本地脚本路径=。。。 -从main/lib/assets.lua导入 本地资产=requireLIB\u路径..'。资产 -从当前目录main/lib/classes导入 本地项目符号=requireBASE..'资产
这将允许您从loader.lua加载这两个脚本,而无需太多麻烦,也不会产生不必要的长路径。

您可以使用requireOther,然后调用Other中的函数。由于某些原因,luarequire在5.4上不起作用……我昨晚睡觉时就想到了这一点,不过,默认情况下它不检查lua的当前工作目录有点奇怪。@Rick它不检查lua的当前工作目录有点奇怪
#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;
      }
   }
}
print("Main Loaded");
dofile("Other.lua");
print("Other Loaded");