# 多包融合工具
# 简介
随着小游戏基础能力的丰富,项目对于运行时加载不同包的需求也越来越高。
比如有些能力依赖较新的微信客户端及基础库,且不同能力的代码包差异较大,需要根据环境加载不同的包。
因此我们增加了多包融合工具,方便开发者做合包操作。
# 工具版本要求
需更新转换插件到v0.1.33。
如果使用wasm分包,需要更新分包插件到1.1.34。
# 融合后的结构
以单线程包 build-st/、多线程包 build-mt/、后缀 mt 为例,融合结果大致如下:
build-merged/
├── game.js
├── game.json
├── project.config.json
├── check-version.js
├── events.js
├── weapp-adapter.js
├── plugin-config.js
├── unity-sdk/
├── workers/
├── minigame/
│ ├── game.js
│ ├── wasmcode/
│ └── data-package/
└── minigame-mt/
├── game.js
├── wasmcode/
└── data-package/
说明:
minigame/:单线程默认包。minigame-mt/:多线程条件包。- 顶层
game.js:融合工具生成的入口文件,负责运行条件判断并加载对应包。 - 顶层
unity-sdk/、plugin-config.js等:公共内容,只保留一份。 wasmcode/、data-package/:每个包自己的内容,保留在各自的minigame*目录内。workers/:合并到顶层,因为小游戏game.json的workers字段不支持按分包拆分。
# game.json 的变化
融合工具会重新生成 game.json 中的 subpackages。
例如原本两个包里都有:
{
"subpackages": [
{
"name": "wasmcode",
"root": "wasmcode/"
},
{
"name": "data-package",
"root": "data-package/"
}
]
}
融合后会变成类似:
{
"subpackages": [
{
"name": "wasmcode",
"root": "minigame/wasmcode/"
},
{
"name": "data-package",
"root": "minigame/data-package/"
},
{
"name": "wasmcode-mt",
"root": "minigame-mt/wasmcode/"
},
{
"name": "data-package-mt",
"root": "minigame-mt/data-package/"
}
]
}
如果不同包里有同名分包,条件包的分包名会自动加后缀,避免和默认包冲突。
# 运行时如何选择包
融合后的顶层 game.js 会先执行环境检测,再根据条件选择加载哪个包。
示例逻辑,以多线程为例:
import checkVersion from ('./check-version.js');
if (wx.env.isSupportStandardWorker) {
require('./minigame-mt/game.js');
}
else {
require('./minigame/game.js');
}
# 使用步骤
以多线程包和单线程包融合为例,按以下方式配置:
1. 默认包路径
选择单线程包目录,例如 build-st/
默认包会被放到融合结果的 minigame/,当运行环境不满足多线程条件时,会加载这个包。
2. 条件配置
添加一个条件包,用于多线程包。建议配置:
| 配置项 | 示例 | 说明 |
|---|---|---|
| 条件表达式 | wx.env.isSupportStandardWorker | 运行时判断当前环境是否支持更完备的多线程能力 |
| 包后缀 | mt | 融合后目录名为 minigame-mt/ |
| 条件包目录 | build-mt/ | 开启渲染线程后导出的多线程包 |
如果后续有更多包,也可以继续添加条件。条件会按顺序判断,先命中的包先生效。
3. 输出目录
选择一个新的输出目录,例如 build-merged/
注意:如果输出目录已存在,工具会先清空再生成。
4. 开始融合
点击"开始融合"。成功后,输出目录就是最终要上传的小游戏包。
# 命令行合包示例
也可以使用 Unity batchmode 调用多包融合工具。
准备配置文件 multi-package-config.json:
{
"defaultPackagePath": "/path/to/build-st",
"outputPath": "/path/to/build-merged",
"packageConditions": [
{
"condition": "wx.env.isSupportStandardWorker",
"packagePath": "/path/to/build-mt",
"packageSuffix": "mt"
}
]
}
执行:
Unity -batchmode -quit \
-executeMethod WeChatWASM.WXMultiPackageMergeCLI.Run \
-configPath "/path/to/multi-package-config.json"
# 注意事项
注意文件路径是否正确
- 合包后,业务的js文件路径会放到minigame*下,要关注原有的import路径是否正确。
- 读写包内文件也要注意路径
wasmcode,wasmcode1,wasmcode2这些目录名不要改动
多包融合不局限于多线程,开发者可以根据需要添加自定义条件包。