中文
resource-icon
热更新 3.0 v2.0.1
类别
Creator扩展 插件
作者
发哥2013
Creator版本要求
v3.0.0
支持平台
AndroidiOS
评分
售价
¥ 9.99 (个人)

介绍

热更新插件

功能介绍

  • 官方热更方案融合到 Creator 构建流程中.
  • 插件支持平台: Windows & MacOS.
  • 构建热更支持的平台: iOS & android & windows & mac
  • 构建后自动拷贝资源文件, 生成 version.manifest、project.manifest 文件.
  • 自动在构建后的 main.js 中注入添加搜索目录代码.
  • 支持命令行构建, 进而可支持 Jenkins 等 CI 工具.

测试 Demo

使用教程

  • 手动构建:

    • [菜单->项目->构建发布->选择支持的发布平台] 会看到如下图的设置界面.

    • 勾选生成热更数据选框.

    • 资源服务地址对应 CDN 的域名等.

    • 设置 [热更存储名], 热更文件存储目录, 会自动加入到 searchPath.

      builder_setting

  • 命令行构建:
    • 配置格式和说明
      // 命令行构建, packages 对应配置, 对应选项不传则使用默认配置
      {
        "hot-update": {
            // 是否构建热更数据
            "hotUpdateEnable": true,
            // 热更服务地址, CDN 地址...
            "remoteAddress": "http://192.168.123.108/",
            // 热更文件存储目录, 会自动加入到 searchPath,
            "storagePath": "hotupdate_storage",
            // 版本号
            "version": "1.0.0",
            // jenkins buildNum | 或其他构建工具
            "buildNum": 1
        }
      }
    • 构建命令示例
      # 构建参数 packages=JSON.stringify(`{"hot-update": {"hotUpdateEnable": true, ...}}`)
      /Applications/CocosCreator/Creator/3.3.0/CocosCreator.app/Contents/MacOS/CocosCreator --project /Volumes/WorkSpace/tutorial-hot-update --build "platform=android;packages={\"hot-update\":{\"hotUpdateEnable\":true,\"remoteAddress\":\"http://192.168.123.108/\",\"version\":\"1.0.0\",\"buildNum\":3}}"
  • 注意事项:
    • 创建 AssetsManager 不传比较函数的话, 热更新版本号不要填写超过 3 位数字, 因为插件会把 buildNum 拼到最后一位, C++ 中的默认比较函数只取 版本号的前 4 个数字进行比较.

构建结果

  • 构建后在项目目录下自动生成热更新文件, 目录结构如下:

    .
    ├── hotupdate-assets                // 热更新文件根目录, 插件创建
    │   └── android                     // 对应构建平台, 上传 CDN 需从此目录开始上传
    │       ├── 1.0.0.1                 // 版本号 + buildNum
    │       │   ├── assets
    │       │   ├── jsb-adapter
    │       │   ├── project.manifest
    │       │   └── src
    │       ├── 1.0.0.3
    │       │   ├── assets
    │       │   ├── jsb-adapter
    │       │   ├── project.manifest
    │       │   └── src
    │       ├── project.manifest       // 每次都会被替换为最新一次构建结果
    │       └── version.manifest       // 每次都会被替换为最新一次构建结果
    ├── package.json
    └── tsconfig.json
  • project.manifest 构建结果示例

    {
        // 实际下载资源的 url 为: packageUrl + assets[key]
        // 例如 http://192.168.123.108/android/1.0.0.3/src/application.js
        "packageUrl": "http://192.168.123.108/android/1.0.0.3",
        "version": "1.0.0.3",
        "searchPaths": [
            "hotupdate_storage"
        ],
        "remoteManifestUrl": "http://192.168.123.108/android/project.manifest",
        "remoteVersionUrl": "http://192.168.123.108/android/version.manifest",
        "assets": {
            "src/application.js": {
                "size": 5738,
                "md5": "aaf093a660c5fa8e6559e264a0eaeed3"
            },
            "其余资源文件省略": {}
        }
    }
  • main.js 脚本注入热更相关代码,添加搜索路径, 主要逻辑参考官方热更 Demo

    // inject by extensions hot-update ---- start ----
    jsb.fileUtils.addSearchPath(jsb.fileUtils.getWritablePath() + "hotupdate_storage", true);
    var fileList = [];
    var storagePath = "hotupdate_storage";
    var tempPath = storagePath + "_temp/";
    var baseOffset = tempPath.length;
    
    if (jsb.fileUtils.isDirectoryExist(tempPath) && !jsb.fileUtils.isFileExist(tempPath + 'project.manifest.temp')) {
        jsb.fileUtils.listFilesRecursively(tempPath, fileList);
        fileList.forEach(srcPath => {
            var relativePath = srcPath.substr(baseOffset);
            var dstPath = storagePath + relativePath;
            if (srcPath[srcPath.length - 1] === "/") {
                jsb.fileUtils.createDirectory(dstPath)
            } else {
                if (jsb.fileUtils.isFileExist(dstPath)) {
                    jsb.fileUtils.removeFile(dstPath)
                }
                jsb.fileUtils.renameFile(srcPath, dstPath);
            }
        })
        jsb.fileUtils.removeDirectory(tempPath);
    }
    // inject by extensions hot-update ---- end ----
    
    // SystemJS support.
    window.self = window;
    require("src/system.bundle.js");
    
    const importMapJson = jsb.fileUtils.getStringFromFile("src/import-map.json");
    const importMap = JSON.parse(importMapJson);
    System.warmup({
        importMap,
        importMapUrl: 'src/import-map.json',
        defaultHandler: (urlNoSchema) => {
            require(urlNoSchema.startsWith('/') ? urlNoSchema.substr(1) : urlNoSchema);
        },
    });
    
    System.import('./src/application.js').then(({ createApplication }) => {
        return createApplication({
            loadJsListFile: (url) => require(url),
        });
    }).then((application) => {
        return application.import('cc').then((cc) => {
            require('jsb-adapter/jsb-engine.js');
            cc.macro.CLEANUP_IMAGE_CACHE = false;
        }).then(() => {
            return application.start({
                settings: window._CCSettings,
                findCanvas: () => {
                    var container = document.createElement('div');
                    var frame = document.documentElement;
                    var canvas = window.__canvas;
                    return { frame, canvas, container };
                },
            });
        });
    }).catch((err) => {
        console.error(err.toString());
    });

用户评分

平均评分
(4.57)
共有 7 位用户参与评分

评论

chengyou1020 2022-06-14 19:37

我尝试做了如下修改: const time = new Date().getTime(); console.log('进入了generateManifest'); const manifest = { packageUrl: encodeURI(packageUrl), version: hotupdateVersion, searchPaths: [packageOptions.storagePath], remoteManifestUrl: encodeURI(`${remoteUrl}/${options.platform}/${projectManifestName}/?v=${time}`), remoteVersionUrl: encodeURI(`${remoteUrl}/${options.platform}/${versionManifestName}/?v=${time}`), assets: {}, };

作者

常规操作是,热更上传的 cdn 之后,给 “project.manifest”, “version.manifest” 两个文件,刷新下 CDN 缓存, CDN 都是支持这个操作的,你这种方式我没这么用过,修改后重启下编辑器试下

chengyou1020 2022-06-14 19:35

作者您好,因为可能存在cdn缓存的问题,我需要在生成的manifest文件后边添加版本号,但是修改了本地hook(/Users/main/.CocosCreator/extensions/hot-update/dist/hooks.js )之后,并没有生效是什么问题呢,如何修改才能实现路径参数调整呢?

Ponyy 2022-06-13 22:23

兄弟 集成热更新后,场景不会显示。

作者

我不太理解你遇到的是什么情况,能描述的再详细点儿吗

hisoftking123 2022-05-14 18:03

您好,我购买了插件,但是在creator3.5里不显示面板

作者

只有 ios android mac windows 平台,才会显示面板,你看下构建平台选的的对不对, 另外看下插件管理那里,是否成功安装

2505817596 2022-05-09 21:53

推荐购买,非常实用

2505817596 2022-05-07 12:45

3.5勾选了,但没有生成热更新文件

作者

3.5 我没测试过,我测试一下,有问题会尽快修复更新 更新: 测试后发现是因为 3.5 构建目录名字变了,稍晚些会修改并测试 2022 - 5 - 9 更新: 已支持 3.5.0 版本

Meung 2022-03-16 16:40

demo 运行不起来

Meung 2022-03-09 11:16

还要自己写代码下载吗

作者

是的, 可以参考我提供的 demo, 这部分涉及到 UI, 每个游戏都不一样没所以也不方便直接提供在插件里

小白花花 2022-02-22 11:30

现在我就是想bundle 资源放远程的,然后进行子游戏更新,不知道如何利用插件设置,之前看插件有这个设置,这版没有

作者

我的插件没有过这个功能, 我看了下论坛, bundle 更新需要勾选 MD5 缓存,这和这个插件,目前是不兼容的

小白花花 2022-02-16 20:25

你好,请问分包热新的要怎么设置

作者

我构建测试了一下,bundle 资源没放远程的话,直接使用就行,无需特殊的处理

  • 1
  • 2

2020 © Cocos.com版权所有

增值电信业务经营许可证:闽B2-20160169

闽ICP备14002653号-6

闽公网安备 35020302033941号