使用 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_loadbuffer
和 checkload
,就像 searcher_Lua
那样。
使用 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_loadbuffer
和 checkload
,就像 searcher_Lua
那样。