你在開發的時候,有沒有覺得有些功能,好像在其他專案也用過?
又或者,有時候需要調整一個功能,或者修一個 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
專案中,自信地「一個一個包起來」!