Swift Package Manager 系列 01|SPM 是什么,为什么它越来越重要?
它不只是一个装依赖的工具,而是在改变 Swift 项目如何组织模块和边界
很多 iOS 开发者第一次真正接触 Swift Package Manager,往往是因为“要接一个第三方库”。
于是很容易得出一个过于狭窄的结论:
SPM 不就是 CocoaPods 的替代品吗?
这个结论只对了一部分。
SPM 当然能装依赖,但如果只把它理解成依赖管理器,就会低估它真正改变的东西。
它正在改变的,其实是 Swift 项目如何定义模块、如何组织依赖、如何建立工程边界。
所以这篇文章我想先把一个前提说清楚:
SPM 的价值,不只是“更方便地拿到代码”,而是“更标准地组织代码”。
一、SPM 首先是 Swift 官方的模块系统入口,而不只是一个下载器
很多工具的核心价值来自生态,有些工具的核心价值来自“是不是官方路径”。
SPM 更接近后者。
它的重要性首先来自三个事实:
- 它是 Swift 官方支持的包管理和模块化方案
- 它和编译器、工具链、Xcode 的演进方向是一体的
- 它不只是管理第三方代码,也天然支持管理你自己的代码
这三点合在一起,意味着它不是一个外围增强工具,而是在逐渐变成 Swift 工程组织的默认语言。
这和“多一个安装依赖的命令”完全不是一个量级的变化。
二、它真正碰到的不是“装库”问题,而是“边界”问题
一个成熟项目真正难管的,从来不是某个库怎么装,而是这些问题:
- 哪些代码应该独立成模块
- 哪些能力应该被宿主工程直接依赖
- 哪些模块之间可以互相引用,哪些不该引用
- 公共能力和业务能力的边界在哪里
SPM 一旦进入项目,这些问题就会变得更具体。
因为你不再只是“在文件夹里分目录”,而是在真正定义:
- 一个模块的公开接口是什么
- 它依赖哪些模块
- 它被谁依赖
- 它应该如何被测试
这也是为什么我说 SPM 的核心不是装库,而是逼你更认真地思考模块边界。
三、为什么它会越来越重要:iOS 项目的复杂度已经不适合“所有代码都堆在一个 target 里”
很多小项目一开始都能靠“一个 App target + 一堆 group”活得很好。
但项目只要进入中型规模,问题就会开始出现:
- 编译速度越来越慢
- 公共能力和业务代码混在一起
- 模块依赖方向不受控
- 一个改动会触发大量无关代码重新编译
- 很难判断哪些代码是真正可复用的
这时你会发现,问题已经不是“文件太多”,而是“工程边界不存在”。
SPM 之所以越来越重要,是因为它提供了一条比“继续在主工程里堆目录”更标准的路径。
它让你可以把模块边界从一种约定,变成真正的工程结构。
四、SPM 和旧时代依赖工具最大的差别,不只是体验,而是角色定位
以前很多人对依赖管理工具的期待很单纯:
- 帮我把第三方库装进来
- 帮我处理版本和集成
但 SPM 很快会把你带到另一个层面:
它不仅管理“别人写的库”,也非常适合管理“你自己拆出来的模块”。
这个变化非常关键。
因为一旦你开始把自己的代码组织成 Package,SPM 的角色就从“安装器”变成了“模块系统”。
这个时候你关心的问题就不再只是:
- 能不能装上
而是:
- 模块接口怎么定义
- 内部实现怎么隐藏
- 依赖关系怎么保持单向
- 哪些模块值得独立测试
这正是工程成熟度开始提升的地方。
五、为什么很多团队迟早会走到 SPM
不是因为它“更新”,而是因为它更符合现代 Swift 项目的组织方式。
一个团队只要开始认真做这些事,就会天然靠近 SPM:
- 想做更清晰的模块拆分
- 想把公共能力抽离出来
- 想减少主工程过度膨胀
- 想让依赖关系显式化
- 想让模块测试更自然
换句话说,很多团队不是“决定采用 SPM”,而是在追求工程边界的过程中,最终发现 SPM 是最顺手的承载方式。
六、但它的价值不在“用了就高级”,而在“边界终于能被认真定义”
这里也要防止另一个误区:
很多人一提 SPM,就容易把它和“模块化成熟团队”画等号。
这其实不准确。
SPM 本身不会自动带来好结构。
如果你本来就没有想清楚:
- 这个模块为什么存在
- 它暴露什么,不暴露什么
- 它和宿主工程是什么关系
那你只是把原来的混乱从主工程目录里搬到了 Package 目录里。
所以 SPM 的价值不在于“用了就现代”,而在于它让很多原本可以含糊过去的边界问题,终于不能继续含糊。
七、它不会自动解决什么
这一点也很重要。SPM 不会自动帮你解决:
- 模块拆得是否合理
- 命名是否清晰
- 依赖方向是否健康
- 某个公共模块是不是抽得太早
- 业务层和基础层有没有混在一起
也就是说,SPM 不是架构师,它只是一个更适合承载良好架构的工具。
如果团队本来就没有边界意识,SPM 最后也可能只是把问题包装得更“现代”。
八、结论:SPM 越来越重要,不是因为它能装库,而是因为它更适合承载模块化工程
如果只用一句话总结,我会说:
SPM 之所以越来越重要,不是因为它终于让我们少装一个 CocoaPods,而是因为它让 Swift 项目更容易把模块边界、依赖关系和工程结构变成显式设计。
所以它真正重要的地方,从来不只是“依赖管理”,而是:
- 模块化
- 标准化
- 边界显式化
这才是它越来越值得认真对待的原因。