使用Physfs从zip包内部使用Lua "require"

使用physfs,通过使用luaL_dostring并自己读取文件,加载和运行lua脚本非常容易,但是当涉及到使用"require"时,它显然会有问题。

有人处理过这个问题吗?我需要重写Lua的某个部分吗?我真的不想那样做!

谢谢。

更新,这是我实现它的方法

static int MyLoader(lua_State *L)
{
    const char *name = luaL_checkstring(L, 1);
    std::string s = name;
    std::replace( s.begin(), s.end(), '.', '/'); // 将所有'.'替换为'/'
    s += ".lua"; // 追加.lua
    File moduleFile = FileManager::ReadFile(s.c_str());
    if( luaL_loadbuffer(L, moduleFile.data, moduleFile.fileLength, name) ) {
        lua_pop(L, 1);
    }
    return 1;
}

然后在创建lua状态之后...

lua_register(L, "my_loader", MyLoader);
const char* str = "table.insert(package.searchers, 2, my_loader) \n";
luaL_dostring(L, str);
点赞
用户1548468
用户1548468

[package.searchers 表] (https://www.lua.org/manual/5.3/manual.html#pdf-package.searchers) 包含了 require 的加载器函数列表。

如果你想让 require 在 zip 文件中加载文件,你需要添加一个函数来检查 zip 文件。如果路径在 zip 文件中存在,就提取到内存缓冲区并调用 luaL_loadbuffercheckload,就像 searcher_Lua 做的那样。

2019-12-16 11:09:13