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个字节~~~~