Swift Package Manager 系列 06|什么时候该用 SPM,什么时候还不适合强上
不是所有项目一模块化就该立刻全量 SPM 化,关键在于你的边界和团队准备好没有
技术社区一旦形成共识,很容易出现另一个问题:
大家开始默认“既然方向对,那就应该尽快全量上”。
SPM 也很容易掉进这个节奏。
它确实是现代 Swift 项目非常重要的工具,但“重要”不等于“任何时候都该立刻全量推进”。
因为工具先进,不代表你当前项目就已经具备承接它的边界和组织条件。
所以我一直不太喜欢那种笼统结论:
- “现在就该全部迁到 SPM”
- “不用 SPM 就落后了”
更实际的问题应该是:
你的项目当前适不适合把某些能力迁到 SPM,以及迁完之后是不是会真的更稳。
一、适合上 SPM 的前提,不是团队想做模块化,而是边界已经开始清楚
如果一个项目目前是这种状态:
- 所有代码高度耦合在一个 App target
- 页面、服务、路由、配置互相穿透
- 公共能力和业务能力边界混乱
那这时候贸然“上 SPM”,很可能只是把现有耦合原封不动搬进多个 Package。
表面上模块化了,实际上依赖关系更难看懂,改起来也更痛苦。
所以我更认同的顺序是:
- 先让边界开始变清楚
- 再用 SPM 承载这些边界
而不是反过来,希望 SPM 自动帮你创造边界。
二、什么时候比较适合开始用 SPM
我通常认为下面这些信号说明项目已经比较适合引入或扩大 SPM:
- 有明确的公共能力模块可以独立出来
- 团队已经开始有边界意识,而不是只按目录分代码
- 某些能力值得独立测试和独立演进
- 主工程已经因为膨胀出现明显维护成本
- 团队愿意为模块边界承担额外设计成本
如果这些条件逐渐出现,SPM 往往会很自然地变成下一步。
三、什么时候不适合“强上”
这里的“强上”,不是说完全不用,而是指那种把 SPM 当作政治任务式推进。
以下几种情况,我会非常谨慎:
1. 项目还很小,主要痛点根本不是模块边界
如果当前项目就几个人、规模不大、边界也相对简单,最主要问题可能压根不是模块化。
这时过早引入一堆 Package,带来的复杂度可能比收益还大。
2. 团队对边界还没有基本共识
如果大家现在连:
- 基础层和业务层怎么分
- 页面层和服务层怎么分
- 公共模块和宿主模块怎么分
都还没有共识,那 SPM 只会把这些争议提前暴露,但不一定能解决它们。
3. 只是为了“看起来先进”
这是最危险的一类动机。
如果采用 SPM 的理由只是:
- 别人都在用
- 架构图会更好看
- 简历上更现代
那大概率最后会变成“形式升级,结构不变”。
四、SPM 最容易被高估的地方:以为它会自动带来好架构
它不会。
SPM 的强项是:
- 承载模块边界
- 显式化依赖关系
- 让模块演进更自然
但它不会替你回答:
- 哪个模块值得存在
- 依赖方向该怎么设计
- 公共层是否抽早了
- 某些业务代码是不是本来就不该独立
也就是说,SPM 更像一块好地基,而不是建筑师。
没有设计意识,换了新地基也一样会盖出复杂结构。
五、迁移策略比“要不要迁”更重要
很多项目不是输在“不该迁”,而是输在“迁法太猛”。
一个更稳的迁移策略通常是:
- 先从边界最清楚的模块试点
- 先做少量高确定性的拆分
- 跑几个迭代,验证依赖和协作成本
- 再决定是否继续扩大
而不是一上来就:
- 全仓库拆包
- 所有公共代码强制进入 Package
- 一次性迁移所有第三方依赖
模块化是长期工程,不适合一波梭哈式推进。
六、一个实用判断标准:用了 SPM 之后,项目会更清楚还是更绕
如果一个改动在迁完之后:
- 依赖方向更清晰
- 模块职责更明确
- review 时更容易判断影响范围
- 测试边界更自然
那这次迁移大概率是值得的。
如果迁完之后:
- 模块更多了但职责没更清楚
- 宿主工程仍然知道一堆内部实现
- 改一个功能要跨多个包来回跳
那说明问题不在工具,而在边界设计本身。
七、结论:SPM 值得用,但不值得用成一场形式主义迁移
如果只用一句话总结,我会说:
什么时候该用 SPM,关键不在“它是不是正确方向”,而在“你的项目和团队当前是否已经准备好用模块边界来承载复杂度”。
所以真正稳的做法不是“全量强上”,而是:
- 在合适的时机用
- 从合适的边界开始
- 用来承载已经想清楚的结构
这样 SPM 才会成为减负工具,而不是新一轮工程负担。