Swift Package Manager 系列 05|在 iOS 项目里接入和管理第三方 Package 的经验
真正难的不是“能不能装上”,而是第三方依赖进入项目后,你还能不能控制边界和升级节奏
很多人谈第三方依赖管理时,关注点都比较前置:
- 这个库能不能通过 SPM 接入
- Xcode 能不能识别
- 版本号怎么写
这些当然重要,但在真实项目里,真正的成本往往不是接进来那一刻,而是它接进来之后的几年。
因为第三方依赖一旦进入项目,就会带来一整串长期问题:
- 升级节奏怎么控制
- API 变化会影响哪些模块
- 是否把具体库直接暴露到了业务代码
- 一旦想替换库,代价会不会很大
所以“管理第三方 Package”真正难的,不是安装,而是治理。
一、接第三方依赖前,先问的不是“好不好用”,而是“它会不会进入核心边界”
一个库进项目前,我最先问的通常不是:
- star 多不多
- 文档漂不漂亮
而是:
- 它会不会直接进入大量业务代码
- 它会不会定义我们未来的某类接口形状
- 它一旦升级或替换,会影响多大范围
因为有些库只是外围能力,比如调试工具、日志后端、一次性小工具;
有些库则会直接进入系统核心,比如网络层、图片层、路由层、存储层。
后者一旦选型失误,后面改动成本会非常高。
所以我更关心它进入的是“边缘层”还是“主干层”。
二、不要让业务代码直接认识第三方库太多细节
这是我觉得最容易被忽略,但最关键的一条经验。
假设你用了某个图片加载库,如果项目里到处都是它的 API:
- View 层直接 import
- ViewModel 也知道它的类型
- 工具层也依赖它
那这个库很快就会从“依赖”变成“基础设施的一部分”。
你将来想升级它、替换它,成本会远超预期。
所以更稳的做法通常是:
- 在合适的边界上包一层自己的抽象
- 让业务依赖你的能力接口,而不是依赖库本身
这不意味着任何第三方库都必须全量包一层,但至少对那些会深入主干层的依赖,应该认真考虑隔离。
三、SPM 让接入更容易,但也容易让“顺手加一个依赖”这件事变得过于轻率
这是一个很现实的副作用。
因为 SPM 接入太顺手了,很多团队会慢慢养成这种习惯:
- 看到一个小需求
- 搜一个库
- 加进去
- 反正也就一个 package
短期看很高效,长期问题会逐渐累积:
- 依赖数量膨胀
- 编译链变长
- 某些库长期无人维护
- 多个库功能重叠
- 项目里开始出现很多“谁也说不清为什么还在”的依赖
所以 SPM 让依赖管理更轻了,但轻不等于该放松治理标准。
越轻的工具,越需要人为把关。
四、版本管理的核心,不是怎么写范围,而是升级策略是否清楚
很多人学 SPM 版本时,会先关注:
- 精确版本
- 范围版本
- upToNextMajor
这些规则需要知道,但工程上更重要的问题其实是:
- 这个依赖是谁负责升级
- 多久审视一次版本
- 升级是跟着业务需求走,还是定期治理
- 升级失败时怎么快速评估影响面
如果这些事情没人负责,那么你写得再漂亮的版本约束,最后也只会变成“几年没动过的固定值”。
所以依赖版本管理本质上不是语法问题,而是治理节奏问题。
五、第三方依赖最怕的不是“用错”,而是“进入系统后没人再看”
很多依赖引入那天大家都很认真,之后就再也没人管了。
这会带来几个典型风险:
- 安全更新长期落后
- API 变化积压到一次升级爆炸
- 团队里没人知道这个库到底还被谁依赖
- 同类能力库不断叠加
于是项目会慢慢进入一种状态:
- 依赖不是不能用
- 但谁也不太敢动
这比“当初选错一个库”更常见,也更难处理。
六、我更看重的是依赖清单是否“可解释”
一个健康的项目依赖清单,不一定很短,但最好是可解释的。
也就是说,你拿起某个依赖时,团队能说清楚:
- 它解决什么问题
- 为什么是它
- 它位于哪一层
- 是否有隔离边界
- 如果未来要替换,代价主要在哪里
如果一个依赖已经变成:
- “以前就有”
- “好像哪里在用”
- “删了怕出事”
那它其实已经进入了治理失控区。
七、一个实用策略:把第三方依赖分层看待
我通常会把依赖分成三类:
1. 边缘型依赖
例如某些开发辅助、日志上报、低频工具。
这类依赖即使用得比较直接,风险也相对可控。
2. 平台型依赖
例如图片、网络、存储、路由等。
这类依赖很可能进入系统主干,更应该认真控制暴露范围。
3. 可替换性很弱的深耦合依赖
有些库一旦接入,就会影响大量 API 设计。
这种依赖最需要在一开始就想清楚边界,不然未来替换成本会非常高。
这种分层思路比“一律直接用”或者“一律全包一层”都更现实。
八、结论:第三方 Package 的核心不是接入,而是长期治理
如果只用一句话总结,我会说:
在 iOS 项目里管理第三方 Package,真正重要的不是“能不能通过 SPM 装上”,而是“它进入系统之后,你还能不能控制它的边界、升级节奏和替换成本”。
所以依赖管理不是一次性动作,而是一种长期治理能力。