清理 Xcode 而不丟失發行產物
Xcode 的空間分散在建置輸出、索引、封存、裝置支援、模擬器裝置與平台執行環境中。有些可以重建,有些卻是已發布版本封存與 dSYM 的唯一副本。清理前應分別測量,並盡量透過 Xcode 管理。
先看空間花在哪裡
先從使用者層級的兩個主要目錄開始:
du -sh ~/Library/Developer/Xcode/* ~/Library/Developer/CoreSimulator 2>/dev/null | sort -h
常見大項包括:
- DerivedData: 建置產物、索引和模組快取,通常每個專案一個目錄。可以重建,但全部清空會讓之後的索引和建置變慢
- DeviceSupport: 從實體裝置和特定系統版本收集的符號與支援資料,舊項目仍可能用於當機符號化
- Archives: 匯出或發布 App 時保存的建置。已發佈版本的封存包含對應的二進位檔與 dSYM,之後分析當機仍會用到。從未離開本機的封存較適合清理
- 模擬器裝置與執行環境: 裝置紀錄位於 CoreSimulator,執行環境由 Xcode 元件管理,它們不是同一種快取
分類別清理
DerivedData 適合按專案處理。結束 Xcode,透過「Xcode > 設定 > 位置」開啟 Derived Data,找出不用的專案目錄並移到垃圾桶。只有全域索引或建置故障明確需要時,才清空全部內容。
刪除執行環境已經不可用的模擬器裝置前,先確認其中沒有需要保留的測試資料,並停止模擬器與相關測試工作;以下指令會刪除裝置及其資料,不經過垃圾桶:
xcrun simctl delete unavailable
這只刪除裝置紀錄,不會解除安裝執行環境映像。透過「Xcode > 設定 > 元件」查看已安裝平台、執行環境和可回收大小,再移除能夠重新下載的項目。Apple 的 Xcode 元件說明記錄了這條受管理的路徑。裝置紀錄則在「視窗 > 裝置與模擬器」中管理。
在「視窗 > Organizer」中檢查封存。對已經發佈、仍可能收到當機報告的建置,封存和 dSYM 還有實際價值。Apple 的除錯資訊說明也提到,二進位檔與 dSYM 只有建置 UUID 相符時才能配合使用。DeviceSupport 同樣更適合逐項檢查,整目錄清空會丟掉特定系統版本的符號資料。
移動 DerivedData 前先結束 Xcode,並停止命令列建置與測試,避免索引或建置資料庫正在寫入。下次開啟專案時,Xcode 會重新索引、解析相依性並產生輸出,所需時間取決於專案和本機輸入。
哪些內容能重建
DerivedData 根據原始碼、設定、工具鏈和相依性產生,包含目標檔、模組快取、索引和建置產物。輸入仍然存在時可以重建,代價是時間和可能的網路下載。
DeviceSupport 是除錯實體裝置時保存的特定系統支援與符號資料。模擬器裝置和執行環境也是獨立的受管理物件。Archives 更需要保留,因為其中的 dSYM 可能是符號化線上當機的唯一相符檔案。
磁碟地圖能幫上什麼
Mole 的「分析」頁可以確認空間主要來自 DerivedData、CoreSimulator 還是 Archives。實際移除仍交給 Xcode 的「元件」「裝置」和 Organizer,這些入口理解執行環境、裝置與發布產物。
安全的清理順序
停止建置後,可以分別測量 Xcode 與 CoreSimulator,從不用專案的 DerivedData、不可用模擬器裝置和閒置執行環境開始。封存則需要與已發布版本及符號化需求逐一核對,重新開啟一個重要專案並完成建置,也能在清空垃圾桶前驗證環境是否完整。