Xcode Clean Build Folder 與刪除 DerivedData 差在哪?
AskClean 團隊 · 更新於 2026-11-02
Clean Build Folder 會清掉目前開啟的 scheme 的建置產物;刪除 DerivedData 重置的範圍更大:除了建置產物,還包括索引、模組快取與記錄。建置壞掉時,先用 Clean Build Folder;索引損毀時,刪除那個專案的 DerivedData 資料夾;真的需要磁碟空間時,就刪除已經不再建置的專案的 DerivedData 資料夾。
差別在範圍,不在清得多徹底
Product > Clean Build Folder(Shift-Command-K)只作用在你目前開啟的專案與 scheme。它會丟掉這個範圍內已編譯的產物與中間檔,讓下一次建置從原始碼重新開始。它的範圍只限一個專案,而且刻意保留重建成本高的東西。
DerivedData 則是所有使用預設位置的專案共用的上層目錄:~/Library/Developer/Xcode/DerivedData,你開啟過的每個專案或工作區都各有一個子資料夾。刪除其中一個子資料夾,只會重置那一個專案;刪除整個目錄,則會讓你所有的專案在下次開啟時都重新建置、重新建立索引。
所以老實說,這兩者的差別不是「輕度清理」和「深度清理」。Clean Build Folder 範圍窄、代價低;刪除 DerivedData 範圍廣,還得賠上索引。該用哪一個,完全取決於壞掉的東西是在建置產物裡面,還是在建置產物之外。
建置出錯時,先從小範圍開始
如果錯誤是在你切換分支、修改建置組態或編輯資源檔之後才出現,先結束正在執行的 App,再用 Clean Build Folder。這是代價最低的重置方式,會保留索引,只要重新建置一次就能回到工作,不必再多等好幾分鐘建立索引。
如果症狀其實和建置產物無關,就升級為刪除該專案的 DerivedData 資料夾,例如:Xcode 對已經修好的程式碼仍顯示錯誤、跳至定義(Jump to Definition)跳到錯的位置、程式碼補全突然看不懂你自己定義的型別。這些都是索引出問題的徵兆,而 Clean Build Folder 不會動到索引。
有一種情況特別值得知道,因為「清理了也沒用」最後變成「刪掉 DerivedData 就好了」,通常就是它:預先編譯的模組快取(ModuleCache.noindex)位在 DerivedData 的根目錄,而不在任何專案的子資料夾裡,Clean Build Folder 永遠碰不到它。SDK 或工具鏈更新後模組快取過期時,只有把它刪掉才能消除錯誤。
兩種做法都修不了原始碼或依賴套件裡真正的錯誤。如果完全相同的錯誤在全新建置後依然存在,就別再清了,請仔細讀編譯器訊息——問題出在專案設定、Package.resolved、選定的 SDK,或程式碼本身。
兩者都不是清理磁碟的方法
Clean Build Folder 是排除建置問題的工具,只是順便釋放一點空間。它能拿回目前專案的空間,但其他專案的建置產物、所有索引和模組快取都原封不動。拿它來回收磁碟空間,等於找錯了對象。
如果真正的目標是空間,就反過來做:先測量 DerivedData 底下各子資料夾的大小,再刪掉好幾個月沒開過的專案。那幾十 GB 通常就藏在這裡——建置過一次就再也沒回去碰的臨時 clone。
不要一開始就用 rm -rf。在 Finder 裡可以把選取的資料夾丟到垃圾桶,清空之前都還能救回;第一次不小心刪到正在建置的專案資料夾時,你就會知道這個差別有多重要。「終端機」適合拿來自動化,但前提是你已經確認過確切的路徑。
實際核對結果,不要只看一個數字
動手前先記下 DerivedData 的大小,兩種做法只選一種執行,然後再測量一次。用過 Clean Build Folder 後,建置目前的 scheme;刪除 DerivedData 資料夾後,開啟 Xcode,等第一次建置和建立索引都跑完。
照這個順序做,才能把拿回的空間和為此付出的代價分開看清楚。沒有放諸四海皆準的數字:結果取決於這台 Mac 上建置過多少專案、組態與架構。
該用哪一個
| 情況 | 怎麼做 | 復原代價 |
|---|---|---|
| 目前的 scheme 建置失敗 | Product > Clean Build Folder | 這個專案重新建置一次;所有專案的索引都會保留。 |
| 錯誤訊息一直不消失、跳至定義失靈 | ~/Library/Developer/Xcode/DerivedData/<project> | 只針對該專案:完整重新建置,再重新建立索引。 |
| SDK 變更後,Clean Build Folder 仍解決不了錯誤 | ~/Library/Developer/Xcode/DerivedData/ModuleCache.noindex | 下次建置時重新編譯模組;Clean Build Folder 碰不到這裡。 |
| 你真的需要磁碟空間 | ~/Library/Developer/Xcode/DerivedData | 刪除過時的大型子資料夾;這些專案下次開啟時會重新建置。 |
| 舊的模擬器執行階段 | Xcode Settings > Components | 完全是另一個類別,兩種做法都不會碰到它。 |
這張表說明的是範圍,不保證能拿回多少 GB。請自己在操作前後測量你的 Mac。
常見問題
Clean Build Folder 會刪除 DerivedData 嗎?
不會。它只清掉你目前開啟的專案與 scheme 的建置產物,不等於刪除共用的 DerivedData 目錄——那裡還存放著每個專案的索引、模組快取與記錄。
刪除單一專案的 DerivedData 資料夾安全嗎?
安全。裡面的一切都是從你的原始碼衍生出來的,Xcode 會重新產生;你的程式碼和 git 歷史都不受影響。唯一的代價是之後第一次建置會是完整建置,接著還要重新建立索引。
需要先結束 Xcode 嗎?
手動刪除 DerivedData 時需要——這樣可以避免索引器在你刪除時佔用或重新建立檔案。使用內建的 Clean Build Folder 指令則不用,那是 Xcode 自己在清理。
清理之後,為什麼錯誤還在?
原因多半從來就不是快取。請檢查編譯器訊息、scheme 設定、依賴套件的版本、Package.resolved、選定的 SDK,以及目前分支實際改了什麼。
Clean Build Folder 沒用,刪除 DerivedData 卻修好了,為什麼?
通常是預先編譯的模組快取造成的。ModuleCache.noindex 位在 DerivedData 的根目錄,而不在專案子資料夾裡,所以 Clean Build Folder 碰不到它,刪除 DerivedData 才會一併清掉。
參考來源