AskClean

Clean Build Folder khác gì xóa DerivedData trong Xcode?

Đội ngũ AskClean · Cập nhật 2026-11-02

Clean Build Folder dọn sản phẩm build của scheme bạn đang mở. Xóa DerivedData đặt lại một phạm vi rộng hơn: sản phẩm build cùng chỉ mục, bộ nhớ đệm module và nhật ký. Khi build bị lỗi, hãy bắt đầu bằng Clean Build Folder; khi chỉ mục bị hỏng, hãy xóa thư mục DerivedData của riêng dự án đó; còn khi thực sự cần dung lượng ổ đĩa, hãy xóa thư mục DerivedData của những dự án bạn không còn build nữa.

Khác biệt nằm ở phạm vi, không phải mức độ triệt để

Product > Clean Build Folder (Shift-Command-K) hoạt động trong phạm vi dự án và scheme bạn đang mở. Lệnh này bỏ đi các sản phẩm đã biên dịch và tệp trung gian của đúng ngữ cảnh đó để lần build tiếp theo bắt đầu lại từ mã nguồn. Nó chỉ tác động đến một dự án và cố ý giữ lại những thứ tốn kém để tạo lại.

DerivedData là thư mục cấp cao nhất dùng chung cho mọi dự án dùng vị trí mặc định — ~/Library/Developer/Xcode/DerivedData, mỗi dự án hoặc workspace bạn từng mở có một thư mục con. Xóa một thư mục con sẽ đặt lại đúng dự án đó. Xóa cả thư mục sẽ khiến mọi dự án của bạn phải build và lập chỉ mục lại ở lần mở tiếp theo.

Vì vậy, không nên mô tả hai cách này là “dọn nhẹ” và “dọn sâu”. Clean Build Folder có phạm vi hẹp và ít tốn kém; xóa DerivedData có phạm vi rộng và khiến bạn mất chỉ mục. Nên chọn cách nào hoàn toàn phụ thuộc vào việc thứ bị hỏng nằm bên trong sản phẩm build hay nằm ngoài chúng.

Khi build bị lỗi, hãy bắt đầu từ phạm vi hẹp

Nếu lỗi xuất hiện ngay sau khi bạn đổi nhánh, thay đổi cấu hình build hoặc sửa tệp tài nguyên, hãy thoát ứng dụng đang chạy và dùng Clean Build Folder trước. Đây là cách đặt lại ít tốn kém nhất, giữ nguyên chỉ mục và giúp bạn quay lại làm việc chỉ sau một lần build, thay vì một lần build cộng thêm vài phút lập chỉ mục.

Hãy chuyển sang xóa thư mục DerivedData của dự án đó khi triệu chứng không thực sự liên quan đến sản phẩm build: Xcode vẫn báo lỗi ở đoạn mã bạn đã sửa, lệnh chuyển đến định nghĩa (jump to definition) nhảy sai chỗ, gợi ý mã không còn nhận ra các kiểu dữ liệu do chính bạn khai báo. Đó là triệu chứng của chỉ mục, mà Clean Build Folder thì không đụng đến chỉ mục.

Có một trường hợp cụ thể đáng biết, vì đây thường là lý do khiến “đã Clean mà không ăn thua” trở thành “xóa DerivedData thì hết lỗi”: bộ nhớ đệm module biên dịch sẵn (ModuleCache.noindex) nằm ở thư mục gốc của DerivedData, không nằm trong thư mục con của dự án nào. Clean Build Folder không bao giờ chạm tới nó. Khi bộ nhớ đệm module trở nên lỗi thời sau khi đổi SDK hoặc toolchain, chỉ xóa nó mới hết lỗi.

Cả hai cách đều không sửa được lỗi thật trong mã nguồn hay phần phụ thuộc của bạn. Nếu đúng lỗi đó vẫn còn sau một lần build sạch, hãy ngừng dọn và đọc thông báo của trình biên dịch — nguyên nhân nằm ở thiết lập dự án, Package.resolved, SDK đang chọn hoặc chính đoạn mã.

Cả hai đều không phải cách giải phóng dung lượng

Clean Build Folder là công cụ chẩn đoán; việc giải phóng được một ít dung lượng chỉ là tác dụng phụ. Nó có thể trả lại dung lượng của dự án hiện tại, nhưng sản phẩm build của mọi dự án khác, toàn bộ chỉ mục và bộ nhớ đệm module vẫn nằm nguyên chỗ cũ. Chạy nó để lấy lại dung lượng ổ đĩa là nhắm sai mục tiêu.

Nếu mục tiêu thực sự là dung lượng, hãy làm theo hướng ngược lại: đo các thư mục con trong DerivedData trước, rồi xóa thư mục của những dự án bạn đã nhiều tháng không mở. Hàng chục gigabyte thường nằm ở đó — những bản clone bạn build một lần rồi không bao giờ quay lại.

Đừng bắt đầu bằng rm -rf. Finder cho phép bạn chuyển các thư mục đã chọn vào Thùng rác, và chúng vẫn khôi phục được cho đến khi bạn dọn sạch Thùng rác — khác biệt này rất quan trọng vào lần đầu bạn lỡ xóa thư mục của một dự án hóa ra đang build dở. Terminal đáng dùng khi cần tự động hóa, nhưng chỉ sau khi bạn đã xác nhận chính xác đường dẫn.

Kiểm tra kết quả thay vì tin vào một con số

Ghi lại kích thước DerivedData trước khi làm bất cứ điều gì, áp dụng đúng một trong hai cách, rồi đo lại. Sau Clean Build Folder, hãy build scheme hiện tại. Sau khi xóa một thư mục DerivedData, hãy mở Xcode và chờ lần build đầu tiên cùng lượt lập chỉ mục hoàn tất.

Làm theo thứ tự đó giúp tách bạch dung lượng bạn lấy lại được với cái giá bạn phải trả để có nó. Không có con số chung nào để kỳ vọng: kết quả phụ thuộc vào số dự án, cấu hình và kiến trúc đã từng được build trên chính chiếc Mac đó.

Nên dùng cách nào

Tình huốngViệc cần làmChi phí khôi phục
Build lỗi ở scheme hiện tạiProduct > Clean Build FolderBuild lại dự án này một lần. Chỉ mục của mọi dự án vẫn được giữ.
Lỗi cũ vẫn hiện, chuyển đến định nghĩa bị sai~/Library/Developer/Xcode/DerivedData/<project>Build lại toàn bộ và lập chỉ mục lại, chỉ với dự án đó.
Lỗi vẫn còn sau Clean Build Folder khi vừa đổi SDK~/Library/Developer/Xcode/DerivedData/ModuleCache.noindexCác module được biên dịch lại ở lần build tiếp theo. Clean Build Folder không chạm tới thư mục này.
Bạn thực sự cần dung lượng ổ đĩa~/Library/Developer/Xcode/DerivedDataXóa các thư mục con lớn đã lâu không dùng; những dự án đó sẽ được build lại khi mở lần sau.
Runtime trình giả lập cũXcode Settings > ComponentsMột danh mục hoàn toàn riêng. Cả hai cách đều không đụng đến nó.

Bảng này mô tả phạm vi tác động, không hứa hẹn một số gigabyte cụ thể. Hãy tự đo máy Mac của bạn trước và sau khi dọn.

Câu hỏi thường gặp

Clean Build Folder có xóa DerivedData không?

Không. Lệnh này chỉ dọn sản phẩm build của dự án và scheme bạn đang mở. Nó không tương đương với việc xóa thư mục DerivedData dùng chung — nơi còn chứa chỉ mục, bộ nhớ đệm module và nhật ký của mọi dự án.

Xóa thư mục DerivedData của một dự án có an toàn không?

Có. Mọi thứ trong đó đều được tạo ra từ mã nguồn của bạn và Xcode sẽ tạo lại. Mã nguồn và lịch sử Git không bị ảnh hưởng. Cái giá duy nhất là lần build đầu tiên sau đó sẽ là build đầy đủ, kèm theo một lượt lập chỉ mục.

Có cần thoát Xcode trước không?

Nếu xóa DerivedData thủ công thì có — để trình lập chỉ mục không giữ hoặc tạo lại tệp trong lúc bạn đang xóa. Với lệnh Clean Build Folder có sẵn thì không cần, vì Xcode tự dọn cho chính nó.

Vì sao dọn rồi mà vẫn lỗi?

Nhiều khả năng nguyên nhân chưa bao giờ nằm ở bộ nhớ đệm. Hãy kiểm tra thông báo của trình biên dịch, thiết lập scheme, phiên bản phần phụ thuộc, Package.resolved, SDK đang chọn và những gì thực sự đã thay đổi trên nhánh hiện tại.

Clean Build Folder không có tác dụng nhưng xóa DerivedData lại hết lỗi. Vì sao?

Thường là do bộ nhớ đệm module biên dịch sẵn. ModuleCache.noindex nằm ở thư mục gốc của DerivedData chứ không nằm trong thư mục con của dự án, nên Clean Build Folder không chạm tới được — còn xóa DerivedData thì có.

Nguồn tham khảo

Tiếp tục dọn dung lượng Xcode