App 三岁了,单工程 40 万行代码,全量编译要 15 分钟,改一行代码喝杯水回来才能跑真机。终于说服老板让我们做组件化。这篇记录前期的方案取舍,给后来人省点力气。

先说结论:不要一步到位上"总线"架构。 网上流传的组件化方案大多是 CTMediator 那一派,运行时解注册表调用。演示很漂亮,但真落地会发现调用关系全靠字符串,IDE 跳转变瞎,重构基本靠全局搜索。我们最后的方案保守得多:

  • 底层工具库(网络、缓存、埋点)拆成独立的私有 pod,用 cocoapods-packager 发到自建的私有源;
  • 业务模块先只在物理上拆目录,通过 protocol 文件互相依赖,暂时不做运行时解耦;
  • 主工程退化为一个壳,只负责组装 tab 和路由。

这个方案跑了半年,编译时间从 15 分钟降到 4 分钟(业务模块可以用 pod install 之后按需引入调试),虽然没到网上吹的"秒级编译",但对日常开发体验的提升已经非常明显。

私有源的坑。 自建源用的是 nexus,权限管理一塌糊涂,最后是靠 git tag + CI 校验版本号一致性来保证不出乱子。后来听说公司内部有 Artifactory 的 license,就迁过去了,省心很多。建议准备做组件化的团队先解决制品库的问题,工具链不顺手,组件化推行不下去——这不是技术问题,是工程习惯问题。

下一阶段的计划是把业务模块间的 protocol 依赖收敛到一个独立的接口层仓库里,谁改接口谁发版。半年后 hopefully 能再写一篇续集,写写中间件方案到底要不要上。