一個一個包起來! Swift Package Manager 的魅力

更新於 發佈於 閱讀時間約 7 分鐘

你在開發的時候,有沒有覺得有些功能,好像在其他專案也用過?

又或者,有時候需要調整一個功能,或者修一個 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 會分成三層架構,分別是 PackageLibrary 和 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 還有其他參數可以調整,例如 platformsswiftLanguageModes 之類的,有需要的話可以參考 官方文件

還有一點重要的,在 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 專案中,自信地「一個一個包起來」!

參考資料

留言
avatar-img
留言分享你的想法!
avatar-img
Rice把拔的生活與開發筆記
0會員
21內容數
這裡是我的開發與生活筆記。 分享iOS開發經驗、教學技巧,也記錄生活中的點滴與觀察。 偶爾來點評論,輕鬆聊聊技術與日常。
2025/07/02
本文介紹臺灣 Open Data 的資源,實作一個簡單的 API Service,並封裝在Swift Package Manager中,方便在其他專案使用。從建立Swift Package Manager專案,到呼叫資料,最後將完成的專案公開於GitHub上。
Thumbnail
2025/07/02
本文介紹臺灣 Open Data 的資源,實作一個簡單的 API Service,並封裝在Swift Package Manager中,方便在其他專案使用。從建立Swift Package Manager專案,到呼叫資料,最後將完成的專案公開於GitHub上。
Thumbnail
2025/06/25
簡單介紹 iPhone/iPad 內建的 Ambient Music 功能,不需要額外下載 App 或訂閱服務,就能播放適合各種情境的音樂。
Thumbnail
2025/06/25
簡單介紹 iPhone/iPad 內建的 Ambient Music 功能,不需要額外下載 App 或訂閱服務,就能播放適合各種情境的音樂。
Thumbnail
2025/06/18
WWDC25 心得分享:iOS開發者觀點,包含對 Apple Intelligence、Shortcuts、Siri、Spotlight 等功能更新的個人看法,以及 Liquid Glass 等新功能的體驗,並推薦一些值得關注的開發者相關 Session。
Thumbnail
2025/06/18
WWDC25 心得分享:iOS開發者觀點,包含對 Apple Intelligence、Shortcuts、Siri、Spotlight 等功能更新的個人看法,以及 Liquid Glass 等新功能的體驗,並推薦一些值得關注的開發者相關 Session。
Thumbnail
看更多
你可能也想看
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文介紹瞭如何在SwiftUI中調整元件的對齊方式,包括置中、向左/向右/向上/向下對齊的方法。透過調整HStack、VStack以及frame的maxWidth、maxHeight和alignment屬性,可以達到想要的對齊效果。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
這份文件的目的是介紹Swift語言,包括它的特性、應用範疇,以及誰在使用它。它也提供了一些學習Swift的資源和工具,以及一些常見的Swift庫和框架。
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
需求情境: 在設計畫面時,資料來源是後台的 api,每一次畫面細節的修修改改,都會觸發 Xcode Preview 程序,導致不斷呼叫後台。此時若資料結構和大小都具有一定規模,就會導致效率低落,不斷等待,且消耗伺服器資源甚鉅。 解決方案: 將後台傳回的資料以檔案形式暫存在本地端,每次 pr
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
Thumbnail
Part.1 搞定基本的 UI 開始開發 iOS App。 首先準備一台 Mac,然後安裝 Xcode,新增專案,系統即刻生成基本的專案結構。coding 的起點在檔案 ContentView.swift: import SwiftUI struct ContentView: View {  
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News