CocosCreator3.X构建iOS工程重置的临时方案

现象

Creator3.x开始,重构了构建系统,比如集成CMake以及拆分编译、构建流程等,这种升级从技术上来说,是能更好的兼容多平台以及定制化构建需求的,但是也使得目前的工程与2.x时代还有着许多差异,本文要讨论的一点是构建iOS平台会重置工程的问题。

因为每次都会重置工程,造成SDK每次都要重新接入,我这边将多个SDK打包在一起并使用了pod,工作量可能还稍微好点,如果真的要将所有SDK重新接入,这个工作量实在太大了,想想都可怕,所以我们不得不找一个解决方案(该方案顺带解决3.x工程Xcode非常卡的问题))

原因

目前来看,是因为官方定制了CMake流程,每次都会重新走一遍,虽然3.4开始官方增加只编译脚本,但是也只是保留了代码,配置依然是清空的,如果需要解决问题,那么需要我们来配置CMake,但很抱歉不熟悉CMake,而且这个流程的配置可能也跟自己接入的SDK有关系,所以通用性应该也有问题,所以本文给出的是一个折中的临时方案。

方案

Creator2.X的构建目录

我们先看下2.x构建后的目录结构,如果关注过Creator原生构建或者以前使用过Cocos 2dx引擎的,可能了解我们构建后跟Cocos有关的部分就是assets(2.4之前的res)、src、jsb-adapter、main.js这几个文件,因此在3.X里我们是不是也可以考虑构建之后只替换这几个文件而不需要动工程呢?那么我们来看下原生工程。

我们分别打开3.X和2.X的Xcode工程,找到资源配置的页面,对比两个工程

3.X的资源构建页面

2.X的资源构建页面

我们惊讶的发现3.X居然是单个文件复制的,即使是可行,一个文件一个文件对比发现有没有新增和减少,这个工作量似乎也不比重新接SDK轻松,我们看下2.X是怎么处理的,似乎要比3.X要简洁的多,于是我们也依葫芦画瓢,把这几个文件夹映射到resources上去。

文件复制完后,是不是要把Copy files这些item删掉(这是逻辑步骤,实操请先删除这些item,参考后面的具体操作步骤),当你兴高采烈的进行这一步的时候,你可能会怀疑人生,点一下卡几秒,这要删除几百上千个文件,人都要蒙了,那怎么办?打开配置文件直接批量删除就可以。于是有人说了,我对iOS不熟,怎么找到配置文件呢?授人以鱼不如授人以渔,这里说下我的查找思路。

既然这是一个配置文件,那么配置的修改必然伴随着配置文件的修改,有修改是不是就可以用版本对比工具,比如用git先把当然的文件暂存,然后删除了item,发现文件变动,依次查找几个就发现了该配置文件,然后删除哪些copy的文件。

重新进到XCode后,有没有感觉自己电脑突然流畅无比了,XCode切换标签也丝滑了,我一直以为是3d工程或者用了m1的原因,想不到根本原因竟然在这~

后续

理论上的东西,到这里我们就已经全部完成,后续我们就要只生成那些资源文件并覆盖就可以了,当然我们要防止工程被覆盖,所以要新增编译任务,编译完成后将该编译生成的文件覆盖过去即可

步骤

以下目录都是默认用的是Creator的默认目录,如果有修改请自行确认

第一次编译

  1. 选择build/ios/proj/项目名.xcodeproj,右键选择显示包内容;
  2. 用文本编辑器打开project.pbxproj
  3. 删除/* Begin PBXcopyFilesBuildhase section *//* End PBXcopyFilesBuildhase section */中间的内容;
  4. 打开Xcode,选择Build Phases;
  5. 选中节点Copy Bundle Resources并点击+
  6. 点击Add Other...
  7. 选中build/ios/assets/下面的文件;
  8. 选择Create folder references和构建Copy items if need即可。

后续编译

如果没有其它编译任务,则新增一个编译任务,目录默认为ios-001,构建完成将build/ios-001/assets覆盖build/ios/assets即可。

思考

这个问题算问题吗?似乎不算,因为引擎的工作是做好了的,并不影响你后续的打包与提交。那有体验吗?我觉得没有,上面的步骤很难吗?其实写一个脚本工具就能轻松简单,即使用CMake,我虽然不熟,但我知道肯定能做,那官方为什么没有做呢?好听点就是没有产品思维,难听点就应付了事,实际就是懒,很多功能真的就是浅尝辄止,真的就是一个功能。

比如官方所注重的所谓的技术升级但体验倒退,有些功能往往就差临门一脚。比如这次提到的构建问题,构建重置工程,每次重新接一次SDK吗?我们再假设所谓的跳过编译工程是可用的,那能解决实际问题吗?其实不能,一个m1的机器,点一下卡一下,根本没发开发,而我们的版本居然还从3.0开发到3.4.1,且最新的3.4.2测试下来还是一样,那所谓的跨平台就是一句空话,是支持,但没法用。

最后也可以理解为什么很多人吐槽cocos呢?吐槽的是bug多吗?不是,哪家引擎没有bug,而是明明能用的,一升级废了。当然,我并不反驳技术升级,比如我第一批使用AndroidStudio的,及时跟进androidX和kotlin,但你不能说我换了工具或者语言后,以前的东西就不能用了吧或者更难用了,技术迭代很重要,但不能舍本逐末。

希望以后,Cocos能更加注重使用体验以及版本兼容性,毕竟是要走向国际的引擎。