AskCleanAskClean

Xóa Xcode DerivedData & bộ nhớ đệm lập trình một cách an toàn

AskClean Team · Updated 2026-07-18

DerivedData là thư mục nháp của Xcode chứa sản phẩm build và chỉ mục, và nó có thể âm thầm phình lên hàng chục gigabyte. Xóa nó là an toàn: thoát Xcode, xóa nội dung của ~/Library/Developer/Xcode/DerivedData, và Xcode sẽ dựng lại mọi thứ ở lần build kế tiếp. Bài này hướng dẫn việc đó, cộng thêm trình giả lập, archive và bộ nhớ đệm gói.

DerivedData là gì và vì sao nó phình to đến vậy

DerivedData là nơi Xcode cất mọi thứ nó sinh ra từ mã nguồn của bạn: đối tượng build trung gian, sản phẩm đã biên dịch, bộ nhớ đệm module, chỉ mục symbol cho tính năng gợi ý mã và nhảy đến định nghĩa, cùng nhật ký build. Mặc định nó nằm ở ~/Library/Developer/Xcode/DerivedData, với một thư mục con cho mỗi dự án hay workspace bạn từng mở.

Nó phình to vì một lý do mang tính cấu trúc: Xcode tạo một thư mục DerivedData cho mọi dự án bạn mở — kể cả những bản clone một lần, build một cái rồi không bao giờ đụng lại — và không bao giờ xóa bất kỳ thư mục nào trong số đó. Mỗi thư mục giữ sản phẩm build riêng theo từng cấu hình và đích (Debug và Release, trình giả lập và thiết bị), nên một dự án cỡ vừa cũng chiếm được vài gigabyte, còn cả thư mục thường chạm mốc 20-50 GB trên một máy lập trình đang hoạt động.

Mọi thứ trong đó đều tái tạo được theo đúng định nghĩa — "derived" nghĩa là như vậy. Xóa DerivedData không bao giờ đụng đến mã nguồn, thiết lập dự án hay bất cứ thứ gì nằm trong quản lý phiên bản. Cái giá duy nhất là thời gian: lần build kế tiếp của mỗi dự án là một bản build sạch toàn phần, và việc lập chỉ mục sẽ chạy lại ở hậu trường trong vài phút.

Xóa DerivedData

Có ba cách làm, và cả ba dẫn về cùng một đích. Lệnh Clean Build Folder của Xcode (Product > Clean Build Folder, hay Command-Shift-K) chỉ dọn sản phẩm build của dự án đang mở — hữu ích khi cần sửa một bản build trục trặc, nhưng gần như không nhúc nhích kim dung lượng ổ đĩa. Muốn thu hồi dung lượng thật, hãy xóa chính các thư mục DerivedData.

Xóa theo từng dự án là phương án tỉ mỉ: giữ lại DerivedData cho hai ba dự án bạn build hằng ngày, và gỡ thư mục của mọi thứ còn lại. Xóa sạch toàn bộ là phương án nhanh gọn, và cũng chẳng sao — bạn chỉ phải trả giá build lại toàn phần cho mọi dự án cùng một lúc.

  1. Thoát Xcode trước đã. Xóa DerivedData trong lúc Xcode đang chạy có thể làm trình lập chỉ mục của nó rối loạn, và những tệp Xcode đang mở có thể không xóa được gọn gàng.
  2. Tìm thư mục: trong Xcode, mở Settings > Locations rồi nhấp mũi tên nhỏ cạnh đường dẫn DerivedData để hiện nó trong Finder. Hoặc trong Finder nhấn Command-Shift-G và nhập thẳng ~/Library/Developer/Xcode/DerivedData.
  3. Sắp xếp các thư mục con theo kích cỡ, chọn những cái muốn bỏ (hoặc Command-A để chọn hết) rồi chuyển vào Thùng rác. Đưa vào Thùng rác trước là thói quen an toàn hơn — đổi ý thì khôi phục lại ngay tức khắc.
  4. Nếu thích dùng Terminal: rm -rf ~/Library/Developer/Xcode/DerivedData xóa mọi thứ trong một phát. Nó nhanh hơn Finder với những thư mục rất lớn, nhưng hãy đọc ghi chú bên dưới trước khi dùng.
  5. Mở lại Xcode và build. Hãy chuẩn bị tinh thần lần build đầu của mỗi dự án sẽ lâu hơn thấy rõ, và "Indexing" sẽ chạy trên thanh hoạt động một lúc — cả hai đều là chi phí một lần.

Cẩn thận với rm -rf: nó bỏ qua Thùng rác và xóa vĩnh viễn, không hoàn tác được. Gõ đường dẫn thật chính xác, đừng bao giờ chạy với sudo cho việc này, và nếu bạn chưa quen Terminal thì đường Finder làm y hệt công việc đó mà vẫn đảo ngược được.

Dọn runtime trình giả lập cũ

Trình giả lập thường là kẻ ngốn dung lượng lập trình lớn thứ hai sau DerivedData. Mỗi runtime iOS, watchOS hay tvOS bạn từng tải về chiếm 5-8 GB, và mỗi thiết bị giả lập giữ thư mục dữ liệu riêng dưới ~/Library/Developer/CoreSimulator/Devices. Nếu bạn đã trải qua vài đợt nâng cấp Xcode, nhiều khả năng bạn còn giữ runtime của những phiên bản iOS đã thôi nhắm đến từ nhiều năm trước.

Chiến thắng nhanh nhất là lệnh dọn dẹp có sẵn: chạy xcrun simctl delete unavailable trong Terminal. Nó xóa mọi thiết bị giả lập có runtime không còn được cài đặt — những đứa con mồ côi mà các phiên bản Xcode cũ bỏ lại — và không đụng gì đến những thứ bạn còn dùng được.

Với chính các runtime, mở Settings > Platforms trong Xcode (gọi là Components ở các phiên bản Xcode cũ hơn). Bạn sẽ thấy từng runtime trình giả lập đã cài kèm kích cỡ; chọn một bản cũ và xóa. Chỉ giữ runtime mới nhất cho mỗi nền tảng, trừ khi bạn chủ động kiểm thử trên các phiên bản OS cũ.

Bạn cũng có thể tỉa từng thiết bị giả lập trong Window > Devices and Simulators: chuyển sang tab Simulators, nhấp chuột phải vào thiết bị nào không bao giờ dùng — sáu chiếc iPhone trùng model với dữ liệu từ những lần chạy thử ngày xưa — rồi chọn Delete. Dữ liệu và ứng dụng lưu trên mỗi thiết bị sẽ đi theo nó.

Archive, tệp hỗ trợ thiết bị và bộ nhớ đệm

Archive tích tụ ở ~/Library/Developer/Xcode/Archives mỗi lần bạn chạy Product > Archive để phân phối một bản build. Mỗi archive chứa trọn một bản build ứng dụng cộng symbol gỡ lỗi dSYM, thường nặng từ 100 MB đến 1 GB một cái. Trước khi xóa, hãy hiểu điều đánh đổi: các dSYM bên trong chính là thứ cho phép bạn giải mã báo cáo sự cố của đúng bản build đó. Giữ archive của những phiên bản còn sống trên App Store hay TestFlight (hoặc xác nhận App Store Connect đã có dSYM), rồi xóa phần còn lại — đường an toàn nhất là Organizer của Xcode (Window > Organizer > Archives), nơi bạn xem xét và xóa chúng với đầy đủ ngữ cảnh.

iOS DeviceSupport, ở ~/Library/Developer/Xcode/iOS DeviceSupport, giữ symbol gỡ lỗi mà Xcode sao chép từ mọi chiếc iPhone hay iPad vật lý bạn từng cắm vào — một thư mục cho mỗi phiên bản iOS, thường 2-5 GB mỗi cái. Những thư mục cho các phiên bản iOS mà chẳng thiết bị nào của bạn còn chạy thuần túy là cục nợ: cứ xóa, và nếu sau này bạn kết nối lại một thiết bị chạy phiên bản đó, Xcode chỉ việc sao chép lại symbol (bạn sẽ thấy "Preparing debugger support" một lần). Các thư mục anh em cho thiết bị watchOS và tvOS cũng tồn tại tương tự.

Xcode còn giữ bộ nhớ đệm riêng dưới ~/Library/Caches/com.apple.dt.Xcode, còn trình giả lập giữ của nó trong ~/Library/Developer/CoreSimulator/Caches — cả hai đều dọn được an toàn khi Xcode và ứng dụng Simulator không chạy, và cả hai được dựng lại khi cần.

Bộ nhớ đệm trình quản lý gói (SwiftPM, CocoaPods, npm, Homebrew)

Trình quản lý gói giữ lại mọi phần phụ thuộc từng tải về để các lần cài sau được nhanh. Đó là kỹ thuật tốt nhưng lại là vệ sinh ổ đĩa tồi: các bộ nhớ đệm chỉ có phình lên, và trên một chiếc máy đã qua vài năm dự án, chúng âm thầm cộng dồn thành 10-20 GB. Tất cả đều dọn được an toàn — tệ nhất thì lần cài kế tiếp phải tải lại gói.

Swift Package Manager lưu đệm các gói đã tải ở ~/Library/Caches/org.swift.swiftpm, và các bản checkout đã resolve của từng dự án cũng nằm trong thư mục DerivedData của nó — nên dọn DerivedData là đã dọn luôn những thứ đó. Bộ nhớ đệm dùng chung thì xóa được từ Finder, hoặc bằng rm -rf trên đường dẫn ấy.

CocoaPods giữ các pod đã tải ở ~/Library/Caches/CocoaPods. Cách sạch sẽ để dọn rỗng nó là lệnh có sẵn: pod cache clean --all. Thư mục Pods của các dự án không bị đụng đến; chỉ bộ nhớ đệm tải về ra đi.

Bộ nhớ đệm của npm nằm ở ~/.npm và có thể chạm nhiều gigabyte trên máy nặng về JavaScript. Chạy npm cache clean --force để dọn rỗng (npm bắt buộc phải có cờ này vì bộ nhớ đệm tự phục hồi và bình thường chẳng cần dọn — xóa nó vẫn hoàn toàn an toàn). Ai dùng pnpm thì chạy pnpm store prune thay thế.

Homebrew tích trữ các bản tải cũ và những phiên bản gói lỗi thời. brew cleanup gỡ các phiên bản lỗi thời và bản tải ế; brew cleanup --prune=all dọn rỗng luôn toàn bộ bộ nhớ đệm tải về. Muốn xem trước danh sách những gì sẽ ra đi, chạy brew cleanup -n trước.

Tự động hóa việc này

Mọi thứ ở trên đều hiệu quả, nhưng rác lập trình là chiếc máy chạy bộ: DerivedData quay lại chỉ sau một tuần làm việc bình thường, bộ nhớ đệm đầy lại, và mỗi bản cập nhật Xcode lại bỏ rơi thêm một runtime nữa. Nếu bạn không muốn tháng nào cũng lặp lại sáu quy trình thủ công, thì đây chính là phần đáng tự động hóa — bằng một công cụ trình bày rõ lập luận thay vì âm thầm xóa hàng loạt.

AskClean coi tệp lập trình là những danh mục hạng nhất: một lần quét liệt kê chi tiết Xcode DerivedData theo từng dự án, runtime trình giả lập cũ (đọc qua simctl, giữ bản mới nhất cho mỗi nền tảng), tệp hỗ trợ thiết bị, cùng bộ nhớ đệm trình quản lý gói của npm, SwiftPM, cargo, uv và nhiều hơn nữa. Nó còn bắt được những kẻ ngốn dung lượng thế hệ mới — bộ nhớ đệm mô hình Hugging Face và Ollama — được liệt kê theo từng mô hình và mặc định không chọn.

Mỗi mục đi kèm một lời giải thích — đó là gì, có dựng lại được không, xóa đi tốn kém ra sao — và không có gì chạy cho đến khi bạn xác nhận. Thao tác xóa đều vào Thùng rác nên một cú nhấp nhầm chỉ cách hoàn tác một cú kéo-thả, còn mã nguồn, tài liệu và ảnh của bạn không bao giờ bị đụng đến. Đó chính là danh sách kiểm tra của bài này, trừ đi một tiếng đồng hồ gõ Terminal.

FAQ

Xóa DerivedData có an toàn không?

Có — đây là một trong những lần xóa cỡ lớn an toàn nhất trên máy Mac. DerivedData chỉ chứa các tệp Xcode sinh ra từ mã nguồn của bạn: sản phẩm build, bộ nhớ đệm module, chỉ mục và nhật ký. Mã của bạn, tệp dự án và lịch sử git nằm ở nơi khác và không bao giờ bị ảnh hưởng. Hệ quả duy nhất là lần build kế tiếp của mỗi dự án phải build lại toàn phần và việc lập chỉ mục chạy lại.

Bao lâu tôi nên dọn DerivedData một lần?

Không có lịch trình bắt buộc — hãy dọn khi nó đủ lớn để đáng bận tâm, với hầu hết lập trình viên năng động thì tức là mỗi một hai tháng. Có hai thời điểm luôn xứng đáng: khi bạn cần dung lượng ổ đĩa gấp, và khi một dự án hiện lỗi build khó hiểu hay gợi ý mã bị ôi thiu — lúc đó xóa trắng DerivedData là phép sửa đầu tiên kinh điển.

Xcode có chậm đi sau khi tôi xóa DerivedData không?

Tạm thời thì có. Lần build đầu của mỗi dự án là một bản build sạch, có thể lâu gấp mấy lần build tăng dần, và việc lập chỉ mục nền cần vài phút trước khi gợi ý mã và tìm kiếm hoạt động trọn vẹn trở lại. Sau chu kỳ đầu đó, hiệu năng trở về đúng như cũ — DerivedData chứa bộ nhớ đệm, không phải thứ tối ưu hóa mà bạn mất vĩnh viễn.

Còn ~/Library/Developer/CoreSimulator — tôi xóa được không?

Đừng xóa mù quáng — nó chứa các trình giả lập đang cài cùng dữ liệu của chúng, và xóa cả cụm sẽ làm chúng hỏng cho đến khi bạn cài lại runtime. Thay vào đó hãy tỉa đúng cách: chạy xcrun simctl delete unavailable cho các thiết bị mồ côi, gỡ runtime cũ trong Settings > Platforms của Xcode, xóa thiết bị không dùng trong Devices and Simulators, và chỉ tự tay dọn mỗi thư mục con Caches.

Clean Build Folder có làm điều tương tự không?

Không. Product > Clean Build Folder (Command-Shift-K) chỉ dọn sản phẩm build của dự án hiện tại, còn để nguyên chỉ mục, bộ nhớ đệm module và thư mục của mọi dự án khác. Đó là công cụ gỡ rối build chứ không phải công cụ dung lượng ổ đĩa — muốn thu hồi dung lượng thật thì phải xóa chính các thư mục DerivedData.

Sources