基本流程(可以简单通过颜色一致的来快速定位相关逻辑)
流程图:
1.创建基础发布包(BaseReleaseVersion)
Parsing command line: -ScriptsForProject=D:\jenkins\workspace\IterativePackage\你的项目.uproject BuildCookRun -project=D:\jenkins\workspace\IterativePackage\你的项目.uproject -noP4 -clientconfig=Development -nocompile -installed -utf8output -targetplatform=Win64 -build -cook -pak -createreleaseversion=71 -createreleaseversionroot=E:\IterativePackage\4.0.2.71 -manifests -compressed -stage -package -archive -archivedirectory=E:\IterativePackage\4.0.2.71\BaseRelease
通过-pak
创建pak包
-createreleaseversionroot =E:\IterativePackage\4.0.2.71
存放4.0.2.71以及基于该版本的所有子版本存放根目录
-createreleaseversion=71
创建版本号,他会在createreleaseversionroot下,再创建一个“71”的文件夹,来存放pak信息(E:\IterativePackage\4.0.2.71\71\…)
通过-archivedirectory=E:\IterativePackage\4.0.2.71\BaseRelease
将这次打包的完整包归档到BaseRelease路径
在输出BaseRelease
后,通过GenerateMD5.py
输出当前版本下的所有文件对应的md5,并保存到当前版本中,输出文件md5compare.txt
2.创建补丁包(PatchVersion)
Parsing command line: -ScriptsForProject=D:\jenkins\workspace\IterativePackage\你的项目.uproject BuildCookRun -project=D:\jenkins\workspace\IterativePackage\你的项目.uproject -noP4 -clientconfig=Development -nocompile -installed -utf8output -targetplatform=Win64 -build -cook -pak -generatepatch -basedonreleaseversion=71 -basedonreleaseversionroot=E:\IterativePackage\4.0.2.71 - -manifests -compressed -stage -package -archive -archivedirectory=E:\IterativePackage\4.0.2.71\LatestArchive
-generatepatch
-basedonreleaseversionroot=E:\IterativePackage\4.0.2.71
一定要和基础版本打包的root一致
-basedonreleaseversion=71
patch所基于的base包版本,方便在root目录下找到基础版本
-archivedirectory=E:\IterativePackage\4.0.2.71\LatestArchive
用‘LatestArchive’来归档最新的包的版本输出,方便和‘BaseRelease’比较得出当前版本的差异
在补丁包完成,生成LatestArchive
归档,通过脚本GenerateMD5.py
生成对应版本的md5compare.txt
,然后再通过OutputMD5Diff.pu
与BaseRelease的md5进行对比,得出差异文件并打包压缩成patch.zip
,归档到版本文件夹中
所有的补丁包只能基于发布包进行创建补丁
,因此更新新版本时候不需要管中间版本,可以直接跨版本升级,如果跨发布包版本更新
,是不可以的。当然,中间还有涉及文件删除,如中控版本更新需要删除无关js,这些在客户端更新时做处理,不在这边处理。
https://zhuanlan.zhihu.com/p/41931214 这篇文章详细介绍了一些参数的具体用法,有兴趣可以看看
路径解析
-
大版本(4.0.2.71),还有一个记录版本和补丁的详细信息文件
ReleaseVersion.json
,其中所有的补丁文件都是和基础版本比较得出的,所以可以直接跨小版本更新
-
大版本(4.0.2.71)下的子版本信息(71、72),
BaseRelease和LatestArchive都是可运行的,BaseRelease保存的是基础包的内容,LatestArchive永远保持最新的内容,其他的编号代表的是各个的版本,保存着各自的版本校验文件(md5),以及patch文件(patch.zip)
-
patch文件夹
-
ReleaseVersion.json
{
"VersionList": [
{
"version": "4.0.2.71",
"basedOnVersion": "",
"packageId": "71",
"patchPath": "",
"md5Patch": "4.0.2.71/BaseRelease/WindowsNoEditor/md5Compare.txt",
"enabled": true,
"baseVersionPath": "4.0.2.71/BaseRelease",
"dateTime": "2022-02-21 11:45:32",
"isBaseVersion": true
},
{
"version": "4.0.2.72",
"basedOnVersion": "4.0.2.71",
"packageId": "72",
"patchPath": "4.0.2.71/72/patch.zip",
"md5Patch": "4.0.2.71/72/md5Compare.txt",
"enabled": true,
"baseVersionPath": "4.0.2.71/BaseRelease",
"dateTime": "2022-02-22 09:46:22",
"isBaseVersion": false
}
]
}
更新程序
1.每个包里都有一个FetchUpdate.exe来获取更新,通过访问nginx上的ReleaseVersion.json
中的每个版本信息,通过exe选择更新的版本(更新不更旧)
2.下载更新版本信息中的patch.zip直接解压缩到本地版本中,覆盖就可以完成更新,
3.在某些版本中,可能更新了中控台页面,涉及到文件删除,则需要md5重新对比出缺失文件进行删除。(这里的md5比较的是本地版本和更新到的版本,和打包的比较不一样,打包比较的是基础和新包)
其他
config不打包进pak
;DefaultGame.ini
[Staging]
+BlacklistConfigFiles=你的项目/Config/DefaultGameUserSettings.ini
+BlacklistConfigFiles=你的项目/Config/DefaultEngine.ini
+BlacklistConfigFiles=你的项目/Config/DefaultGame.ini
+BlacklistConfigFiles=你的项目/Config/DefaultInput.ini
在DefaultGame.ini中加入[Staging]节点,往BlacklistConfigFiles列表里面加入<项目>/config/不打包进pak的.ini
这一步,只是实现了ini不打包进pak,还需要将ini暴露到原来的文件路径,则需要在<项目>.build.cs中添加ini的引用关系。
RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "../../Config", "DefaultGameUserSettings.ini"));
RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "../../Config", "DefaultEngine.ini"));
RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "../../Config", "DefaultGame.ini"));
RuntimeDependencies.Add(Path.Combine(ModuleDirectory, "../../Config", "DefaultInput.ini"));