CCLuaLoadChunksFromZIP加载后require的问题, 你们热更新都没遇到吗?

我使用的版本是Cocos2d-lua 3.5

热更新是按照quick版本的帖子移植过来的, 现在只有一个问题:

我是使用quick的 compile_scripts 工具 将我项目中的login, game, 这两个文件生成对应的zip包.

项目启动时通过 CCLuaLoadChunksFromZIP 引用 zip 包, 但是接着往后执行, 就遇到问题了.

在没使用zip, 纯src代码执行时, 引用 login/Login.lua 时, 是这样用的
require(‘login.Login’).new():run()

但是当使用了 CCLuaLoadChunksFromZIP 引用了login.zip时,
‘login.Login’ 是找不到对应的Login.lua, 只能修改为 ‘Login’ 才能找到,

因为查看CCLuaStack.cpp代码中的 luaLoadChunksFromZIP 方法
它只是将zip包中的每个文件名作为参数
lua_setfield(L, -2, filename.c_str());

这样的话, 就只能通过Login才能找到对应的文件, 它没有为它添加前缀, 比如 login.Login

不知道你们看懂了我的问题没

贴下部分log

lua_loadChunksFromZIP() - load zip file: C:/Users/zzz/AppData/Local/luaapp/res/lib/login.zip*
add events to preload
add init to preload
add Login to preload
add models.DataModel to preload
add models.facebook to preload
add models.SDKModel to preload

谢谢了!

那个代码应该是有bug, 你可以参照一下quick 2.X的版本的代码 我拷贝了一段 你比较一下
CCLuaStack *stack = CCLuaStack::stack(L);

do
{
    unsigned long size = 0;
    void *buffer = NULL;
    unsigned char *zipFileData = utils->getFileData(zipFilePath.c_str(), "rb", &size);
    CCZipFile *zip = NULL;

    bool isXXTEA = stack && stack->m_xxteaEnabled;
    for (unsigned int i = 0; isXXTEA && i < stack->m_xxteaSignLen && i < size; ++i)
    {
        isXXTEA = zipFileData* == stack->m_xxteaSign*;
    }

    if (isXXTEA)
    {
        // decrypt XXTEA
        xxtea_long len = 0;
        buffer = xxtea_decrypt(zipFileData + stack->m_xxteaSignLen,
                               (xxtea_long)size - (xxtea_long)stack->m_xxteaSignLen,
                               (unsigned char*)stack->m_xxteaKey,
                               (xxtea_long)stack->m_xxteaKeyLen,
                               &len);
        delete ]zipFileData;
        zipFileData = NULL;
        zip = CCZipFile::createWithBuffer(buffer, len);
    }
    else
    {
        zip = CCZipFile::createWithBuffer(zipFileData, size);
    }

    if (zip)
    {
        CCLOG("lua_loadChunksFromZIP() - load zip file: %s%s", zipFilePath.c_str(), isXXTEA ? "*" : "");
        lua_getglobal(L, "package");
        lua_getfield(L, -1, "preload");

        int count = 0;
        string filename = zip->getFirstFilename();
        while (filename.length())
        {
            unsigned long bufferSize = 0;
            unsigned char *buffer = zip->getFileData(filename.c_str(), &bufferSize);
            if (bufferSize)
            {
                if (lua_loadbuffer(L, (char*)buffer, (int)bufferSize, filename.c_str()) == 0)
                {
                    lua_setfield(L, -2, filename.c_str());
                    ++count;
                }
                delete ]buffer;
            }
            filename = zip->getNextFilename();
        }
        CCLOG("lua_loadChunksFromZIP() - loaded chunks count: %d", count);
        lua_pop(L, 2);
        lua_pushboolean(L, 1);
    }
    else
    {
        CCLOG("lua_loadChunksFromZIP() - not found or invalid zip file: %s", zipFilePath.c_str());
        lua_pushboolean(L, 0);
    }

    if (zipFileData)
    {
        delete ]zipFileData;
    }
    if (buffer)
    {
        free(buffer);
    }
} while (0);

**

我比对了下两边的代码, 基本没什么差别.

不知道他们在使用quick版本的热更新时, 还有哪些地方有不一样的~~~

顶一下, 有知道的麻烦告知一下呢.~

好吧, 已经解决了, 差个参数, 可以设置前缀

哪个参数 :2: :2: :2: :2: :2:

-p

文章内容少于10个字节~~~~