症狀:新專案想要少一層整合負擔,存量專案卻被 Podfile、腳本和二進位 SDK 綁住。
最快解法:新建且主要依賴已支援 Swift Package Manager 的專案,先選 Swift Package Manager;仍依賴僅提供 Pod 或特殊安裝流程的專案,先保留 CocoaPods。混合專案則以雙軌驗證、逐項替換,不要強行全量遷移。
誰適合看這篇?
如果你準備建立原生 Swift iOS/macOS 專案,需要決定預設依賴管理方式,本文可直接作為採購與技術選型依據。
如果你維護含 CocoaPods、私有元件或二進位 SDK 的存量 App,本文會幫你判斷遷移是否值得。需要在遠端 Mac 或持續整合環境完成穩定 Archive 的小型團隊,也應特別留意後半段的驗收流程。
CocoaPods vs Swift Package Manager,先按專案現況決定
不要先問哪個工具「比較新」。先盤點依賴來源、Target 數量、安裝腳本和近期發版壓力。下表是第一輪篩選,不是對所有專案的永久結論。
| 專案狀況 | 優先方案 | 主要理由 | 暫停切換的訊號 |
|---|---|---|---|
| 新建原生 App,主要套件已有正式 Package | Swift Package Manager | 與 Xcode 原生整合,版本資料可提交至儲存庫 | 關鍵 SDK 缺少資源或二進位支援 |
| 已穩定發版的 CocoaPods 專案 | 先保留 CocoaPods | Podfile、Podfile.lock、Workspace 和腳本已形成可重現流程 | 依賴維護成本持續升高,且已有等價 Package |
| 私有原始碼元件 | 逐項比較 | 兩者都要處理存取權限、版本和團隊授權 | 私有儲存庫認證無法在 CI 非互動執行 |
| XCFramework 或附帶資源的 SDK | 以提供方正式文件為準 | 不能因為 SDK 使用 Swift,就推定它支援 Package | 缺少正式 Package 描述或資源驗證方式 |
| 同時包含兩類依賴的專案 | 暫時雙軌 | 可先處理低風險元件,保留回退路徑 | 同一函式庫重複引入或傳遞依賴衝突 |
Swift Package Manager 的實際優勢,首先在於 Xcode 對 Swift package 的整合,而不是一句「安裝更簡單」。Apple 的 Swift Packages 官方文件說明了在 Xcode 中加入、解析及管理套件的基本方式;Swift 官方的 PackageDescription 參考則界定 Package.swift 能描述的產品、Target、資源和依賴。
對新專案來說,這代表你可以先檢查套件是否有可用的 Package、資源是否能正常打包,以及二進位 Target 是否符合目前工具鏈,再決定預設方案。若只因「官方整合更深」就直接切換,仍可能在 Archive 或上架前才發現邊界問題。
新建 App:為何通常先評估 Swift Package Manager?
新建專案沒有歷史包袱。你不需要為了維持舊 Workspace 而保留一套安裝層,也沒有大量自訂 Podfile 腳本需要逐行重寫。這是 Swift Package Manager 最適合先被評估的場景。
版本鎖定不是「加入套件」就完成
Swift Package Manager 會使用 Package.swift 描述套件依賴,Xcode 專案則可產生 Package.resolved 來記錄解析後的版本狀態。Apple 的 持續整合建置說明提醒,CI 建置需要把依賴解析與建置流程視為整體,而不是只在開發者電腦上按一次「Resolve」。
你應該把 Package.resolved 納入版本控制,並在程式碼審查時檢查它是否隨依賴變更一起更新。需要強制重新解析時,再按 Swift Package Manager 的解析命令文件所述使用明確指令,而不是刪除檔案後碰運氣。
優點
- 對原生 Swift 專案的整合路徑較直接。
- 依賴描述和版本鎖定檔可放在同一個程式碼儲存庫。
- 新建遠端 Mac 時,少一層 Ruby、CocoaPods 版本和 Workspace 生成問題。
限制
- 套件是否支援資源、二進位 Target 和特定平台,必須逐一確認。
- 私有儲存庫需要在 CI 配置憑證,不能把本機登入狀態當成自動化方案。
- 某些 SDK 的官方安裝文件仍只提供 CocoaPods 流程。
提醒:「可被 Swift 編譯」不等於「可用 Swift Package Manager 整合」。你還要查清楚模組、資源、連結框架和簽名步驟。
存量 CocoaPods 專案:什麼時候不應急著遷移?
成熟 CocoaPods 專案的價值,往往不在工具本身,而在已經被發版流程驗證過。Podfile 可能包含條件安裝、編譯旗標、Script Phase、私有來源和多個 Target。這些設定一旦搬到另一種管理方式,就必須重新確認實際產物。
CocoaPods 官方文件明確區分 pod install 與 pod update:前者會依照 Podfile.lock 盡量維持現有版本,後者才會主動更新依賴。你可參考 pod install 與 pod update 的差異說明。因此,Podfile.lock 不是可有可無的暫存檔;它是既有建置鏈的重要輸入。
| 需要檢查的項目 | CocoaPods 存量風險 | 遷移時要取得的證據 |
|---|---|---|
| 依賴描述 | Podfile 可能含條件和自訂來源 | 每個 Pod 是否有等價 Package |
| 版本狀態 | Podfile.lock 鎖住目前解析結果 | Package.resolved 是否能重現相同版本意圖 |
| 專案入口 | Workspace、xcconfig 和 Script Phase 互相配合 | 新專案入口能否完成相同編譯設定 |
| 發佈鏈路 | 憑證、Archive、上傳可能依賴既有腳本 | 乾淨環境能否完成 Archive |
| 團隊操作 | Ruby 和 CocoaPods 版本可能已被固定 | CI 與新主機是否可非互動恢復 |
以下情況,保留 CocoaPods 往往比立即遷移更合理:
- 關鍵依賴只正式提供 Pod,沒有可驗證的 Package。
- 遷移會同時影響多個 App Target、Extension 或測試 Target。
- 你正處於緊急修正版或上架窗口,沒有時間完成完整回歸。
- Podfile 中已有自訂腳本,但團隊仍能在乾淨主機重建。
- 當前問題只是本機環境失效,而不是依賴管理方式本身已無法維護。
這不是替 CocoaPods 永久背書。它是對發版風險的控制。一次成功編譯不能證明遷移完成,Archive、測試和新主機恢復才算完成。
私有依賴與二進位 SDK,應按交付方式比較
私有原始碼元件、內部共用模組、XCFramework 和附帶資源的第三方 SDK,表面上都叫「依賴」,實際交付條件卻不同。
| 依賴交付方式 | Swift Package Manager 要確認 | CocoaPods 要確認 | 決策重點 |
|---|---|---|---|
| 公開原始碼套件 | Package.swift、平台條件、資源 | Podspec、版本與平台條件 | 以正式支援度和測試結果選擇 |
| 私有原始碼儲存庫 | SSH/Token、版本標籤、CI 權限 | 私有 Spec Repo、Pod 儲存庫權限 | 先驗證非互動認證 |
| XCFramework | Binary Target、校驗與架構 | Podspec、vendored_frameworks | 由 SDK 提供方文件決定 |
| 含圖片或其他資源的 SDK | Resource 宣告、Bundle 取用方式 | resource_bundle 或等價設定 | 必須在 Archive 產物內檢查資源 |
| 多平台內部元件 | iOS、macOS、模擬器條件 | Podspec 的 platform 設定 | 不要只看 Swift 語言相容性 |
CocoaPods 官方提供 私有 Spec Repo 的設定指南,但你仍需把倉庫權限、憑證保存和版本標籤納入 CI 設計。Swift Package Manager 也能處理私有套件,但能否順利使用,取決於儲存庫認證、套件描述和二進位交付方式。
命令中的所有私有資訊都應使用占位符,例如:
git clone git@<PRIVATE_HOST>:<TEAM>/<PRIVATE_REPOSITORY>.git
export CI_TOKEN="<REDACTED_TOKEN>"
xcodebuild -workspace <APP_WORKSPACE>.xcworkspace \
-scheme <APP_SCHEME> archive \
-archivePath <ARCHIVE_PATH>
不要把真實倉庫地址、使用者名稱、Token、專案名稱或私有依賴名稱提交到文章範例、Shell history 或 CI 設定。這是權限管理問題,不是某一個依賴工具的優缺點。
混合專案:先建立可回退的雙軌遷移
一個 Xcode 專案可以在遷移期並用 CocoaPods 和 Swift Package Manager,但你要把「並存」當成過渡架構,而不是永久放任。
最常見的事故,是同一個函式庫同時透過 Pod 和 Package 引入。它可能造成重複符號、模組名稱衝突、資源重複,或讓不同 Target 使用不同版本。遷移前先列出每個依賴的來源與消費者,再決定批次。
第一步:建立依賴盤點表
記錄每個依賴的名稱、版本鎖定檔、使用 Target、是否含資源、是否為二進位,以及是否依賴安裝腳本。不要只抄 Podfile;還要檢查 Workspace、xcconfig、Build Phase 和 CI 指令。
第二步:先處理邊緣元件
優先挑選不參與啟動流程、不影響簽名、不含複雜資源的低風險元件。核心網路層、支付 SDK、分析 SDK 和登入元件留到後面,因為它們通常會影響多個 Target 或上架驗證。
第三步:一次只替換一個來源
移除某個 Pod 後,再加入對應 Package。確認它沒有被其他套件以傳遞依賴重新帶回。每一批變更都應有獨立提交,讓你能在發版前快速回退。
第四步:分層驗證,不要跳過中間結果
依賴解析成功,只代表版本圖能被建立。下載成功,只代表來源可存取。之後還必須分別驗證:
- Xcode 能否完成普通 Debug/Release 建置。
- 單元測試與 UI 測試是否通過。
- 模擬器與實機架構是否都能連結。
- Archive 是否成功,產物是否含必要資源。
- 簽名、Export 和上傳流程是否仍可執行。
第五步:保留原流程和回退條件
在核心元件完成驗證前,不要刪除原有 Podfile、Podfile.lock 或相關腳本。當 Package 在解析、資源或 Archive 階段出現阻塞,就回退到上一個可發版提交,而不是在上架窗口臨時修兩套流程。
經驗:雙軌期間最重要的不是「兩個工具都能安裝」,而是每個 Target 都清楚知道依賴來源。沒有來源清單,就沒有可靠的回退路徑。
遠端 Mac 建置:如何驗收可重現的依賴流程?
遠端 Mac 或 CI 伺服器最容易揭露本機環境的假象。你的電腦可能已經有 Git 憑證、Ruby 套件、Xcode 快取和舊有 DerivedData;換到一台乾淨主機後,依賴解析、下載、編譯與 Archive 可能在不同階段失敗。
建議的驗收順序
- [ ] 將
Package.resolved或Podfile.lock與必要的描述檔提交到版本控制。 - [ ] 在全新 macOS 使用指定的 Xcode、命令列工具和 Git 設定。
- [ ] 清除既有依賴快取,測試無快取狀態下的解析與下載。
- [ ] 使用非互動式 SSH/Token 認證存取私有套件或 Spec Repo。
- [ ] 分別記錄依賴解析、來源下載和專案編譯的結果。
- [ ] 執行測試,再執行 Archive;不要以「安裝完成」作為驗收終點。
- [ ] 重啟或更換遠端 Mac 後重跑流程,確認不依賴本機狀態。
- [ ] 保存失敗日誌、鎖定檔差異和回退提交。
Apple 的 CI 建置 Swift package 與 App 文件可用來核對 CI 流程;CocoaPods 的 命令參考則可確認 pod install 等命令的預期用途。
如果你使用 CocoaPods,遠端環境還要固定 Ruby、CocoaPods 和必要插件的安裝方式。如果你使用 Swift Package Manager,則要特別檢查私有來源認證、Package.resolved 是否被採用,以及二進位套件在乾淨環境的下載與架構。兩者都不能只靠快取換取表面上的速度。
完成流程後,可把驗收結果分成「可發版」「需修正」「可回退」三類。不要把一次成功建置解讀為長期穩定;真正的標準是主機重建後,團隊能否用同一份鎖定資料取得同一類型的 Archive 產物。
用這張決策卡作最後選擇
在提交遷移計畫前,逐項回答:
- [ ] 目前大部分依賴是否都有正式且可驗證的 Swift Package?
- [ ] 關鍵 SDK 是否支援目前 iOS、macOS、模擬器和實機架構?
- [ ] 是否已檢查資源、二進位 Target、Script Phase 和多個 Target?
- [ ] CocoaPods 的 Podfile 腳本是否真的造成維護成本,而非只是本機一次故障?
- [ ] 團隊是否有一個完整發版窗口,可重做測試、Archive 和上傳驗證?
- [ ] 私有依賴是否能在遠端 Mac 以非互動方式完成認證?
- [ ] 是否保存了上一個可發版提交,並測試過回退路徑?
- [ ] 是否確認同一函式庫不會同時由 Pod 和 Package 引入?
若前幾項大多為「是」,新專案可把 Swift Package Manager 作為預設;若關鍵依賴仍只有 Pod、腳本複雜或發版窗口很短,繼續使用 CocoaPods。若答案分歧,雙軌並存一段時間,先遷移低風險元件,等核心 Target 通過乾淨環境 Archive 後再決定。
常見問題
2026 年新建 iOS 專案,還需要 CocoaPods 嗎?
新專案通常應先評估 Swift Package Manager,前提是關鍵依賴提供正式 Package,且資源、二進位和平台條件都已驗證。若核心 SDK 只提供 Pod,或團隊已擁有穩定的 CocoaPods 發版鏈路,保留 CocoaPods 仍是合理選擇。
Swift Package Manager 能完全取代 CocoaPods 嗎?
不能用單一結論套用所有專案。Swift Package Manager 對原生 Swift 專案的整合較自然,但私有依賴、XCFramework、資源和特殊腳本仍要看提供方文件。你應以每個 Target 的解析、編譯、測試和 Archive 結果作判斷。
CocoaPods 專案遷移到 Swift Package Manager 值得嗎?
當大部分依賴已有等價 Package,而且 Podfile、Ruby 環境和自訂腳本正在增加維護成本時,遷移可能值得。若正值緊急發版、核心 SDK 沒有替代方案,或專案包含多個特殊 Target,先不遷移通常更能控制風險。
一個 Xcode 專案可以同時使用兩種依賴管理方式嗎?
可以,但必須防止同一套函式庫被重複引入,也要檢查傳遞依賴和資源。建議以低風險、邊緣元件開始,為每批變更保留獨立提交,並在每次替換後重新執行測試及 Archive。
遠端 Mac 建置時,如何保證 iOS 依賴版本一致?
提交 Package.resolved 或 Podfile.lock,固定依賴描述與認證流程,並在沒有快取的乾淨遠端 Mac 執行完整驗收。解析成功、下載成功和編譯成功是不同結果,最後仍要確認測試與 Archive,以及更換主機後能否重現。
若你目前的方案是把一台本地 Mac 長期留作打包機,常見缺點是硬體被單一流程佔用、環境修改容易影響日常開發,而且要自行處理遠端連線、帳號權限與主機故障。若改用一般雲端主機,又可能缺少完整 macOS 工具鏈和 Xcode Archive 所需的實體環境。完成依賴方案選擇後,使用 KVMNODE 的獨立遠端 Mac 先做乾淨環境恢復、測試和 Archive,通常比直接改動現有生產機更容易控制風險;你可先查看 KVMNODE 遠端 Mac 服務入口,再參考遠端 Mac 方案,按專案週期決定是否把驗證環境納入持續整合流程。若你需要的是臨時遷移測試,而非全年固定負載,按週或按月使用一台可重建的 macOS 環境會更符合這類工作。