你在開發的時候,有沒有覺得有些功能,好像在其他專案也用過?
又或者,有時候需要調整一個功能,或者修一個 bug,但卻不小心把其他功能搞壞了?
讓我們想像一下,當你在開發一個 App 時,就像在蓋一棟樂高城堡。
你會按部就班地將各個零件組裝起來,如果需要調整或更換顏色,只要把對應的組件拆下來更換即可。而且有些通用的零件,你可能在蓋另一座太空船時也會用到。
理論上來說,好的程式碼,應該就要像這樣,高內聚、低耦合,各司其職,並且可以重複使用。
但在實際開發的時候,常常會一不注意,做出來的產品不像是樂高,更像是一坨黏土。導致我們再調整功能的時候,一不小心就會把其他功能搞壞。
而 SPM 就是你的官方樂高儲藏箱。
它是由 Apple 親自打造,與 Swift 語言和開發環境(如 Xcode)深度整合的工具,讓你能夠輕鬆地建立、分享,並在專案中重複使用這些「程式碼零件」。
在 SPM 誕生之前
在 SPM 出現(2016, Swift 3.0)之前,iOS 的開發生態裡,Cocoapods 和 Carthage 是兩個最常用的套件管理工具。
兩者各自有不同的優缺點,也有不同的擁護者,比較大型的第三方套件基本上會同時支援這兩者,讓使用者各取所需。而 SPM 的出現,則為開發者提供了新的、更原生的選擇,讓你專案的組成更加的 Swift 化。
到了 2025 年,大部分的第三方套件都已經支援 SPM,而 Cocoapods 和 Carthage 的使用者則是越來越少。
Cocoapods 官方已經在 2024 年宣布進入維護模式,而 Carthage 雖然沒有正式宣告,但本來使用者就比較少,因此也逐漸被取代。
什麼是 SPM?
SPM 是 Swift Package Manager 的縮寫,是 Apple 官方推出的套件管理工具,它與 Swift 語言深度整合,為開發者提供了一個方便快捷的方式來管理專案中的第三方套件。
你可以透過 Xcode 的 UI,或者也可以自行編輯 Package.swift 來管理你的套件。
SPM 的核心概念
基本架構
一個基本的 Package 會分成三層架構,分別是 Package、Library 和 Target。
我們以 Alamofire 的 Package.swift 為例,先從最小的單位開始介紹。
Target
Target 是 Package 中的基本單位,分為 Target 和 TestTarget 兩種。
在 Alamofire 中的最下面的 targets 可以看到裡面有一個 Alamofire 的 Target,以及一個 AlamofireTests 的 TestTarget。
Library
Library 是一個可以包含多個 Target 的集合,可以把同性質/功能的 Target 放在一起。
可以看到 Alamofire 中,有兩個 Library,分別是 Alamofire 和 AlamofireDynamic。
Package
Package 是最外層,可以包含多個 Library,放在 products 中。
在最上面我們可以看到 name: "Alamofire",這就是你的 Package 的名稱。
以上大概就是整個 Package.swift 檔案的基本架構。
套件管理
除了上面基本的三個元件之外,還有一個比較常用到的就是 Dependency。
在 SPM 中,套件管理是透過 Package.swift 中的 dependencies 來管理的。
你可以在這邊引用其他 Package 的 Library,讓你的 Target 可以使用到其他人的邏輯。
其他
除了上面提到的,Package.swift 還有其他參數可以調整,例如 platforms、swiftLanguageModes 之類的,有需要的話可以參考 官方文件。
還有一點重要的,在 Package.swift 的第一行,可以看到像這樣:
// swift-tools-version: 6.0這行是告訴 SPM 你的 Package 需要使用的 Swift 版本。
千萬不要以為他是註解,如果把它刪掉的話,Package 會不知道要使用哪個版本的 Swift 來編譯。
Package 的 Access Control
在 SPM 中,預設的 Access Control 是 internal,也就是說,只有同一個 Target 中的程式碼可以存取。
當你要讓外部的程式呼叫你的程式碼時,你需要將 Access Control 設為 public,沒有宣告 public 的話,就沒辦法讓外部使用。
而如果有些程式碼你希望能在 Package 中跨 Target 使用,Swift 5.9 之後新增了 package access modifier,可以讓你更精確地控制存取權限。
透過良好的 Access Control,減少暴露了不必要的程式碼,讓外部使用者只能看到他們需要的東西不易誤用,你的程式碼也更安全,更易於維護。
總結
原生的 Swift Package Manager 將 Swift 生態系提升到一個新的高度,你不需要多學額外的工具和設定,就能夠輕鬆地管理你的第三方套件。
而善用 SPM 的特性,自行將邏輯拆分,並管理好 Access Control,可以讓你的專案模組化程度更高,程式碼也更安全,更易於維護。
希望這篇文章能幫助你領略 SPM 的魅力,並在你的下一個 Swift 專案中,自信地「一個一個包起來」!
























