使用 physfs 从 zip 内部使用 Lua "require"

Using Lua "require" from inside a zip using physfs

使用 physfs 时,加载和 运行 一个 lua 脚本很容易,只需使用 luaL_dostring 并自己读取文件,但是当涉及到使用 "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(), '.', '/'); // replace all '.' to '/'
    s += ".lua"; // apend .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);

package.searchers table 包含 require 的加载程序函数列表。

如果您希望require 从 zip 文件加载文件,您将需要添加一个检查 zip 文件的函数。如果压缩文件中存在该路径,将其解压缩到内存缓冲区并调用 luaL_loadbuffercheckload,就像 searcher_Lua 那样。