AskClean

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 โดยมีโฟลเดอร์ย่อยหนึ่งโฟลเดอร์ต่อโปรเจกต์หรือ workspace ที่คุณเคยเปิด การลบโฟลเดอร์ย่อยหนึ่งโฟลเดอร์จะรีเซ็ตเฉพาะโปรเจกต์นั้น ส่วนการลบทั้งไดเรกทอรีทำให้ทุกโปรเจกต์ของคุณต้องบิลด์และทำดัชนีใหม่เมื่อเปิดครั้งถัดไป

ดังนั้นสองวิธีนี้ไม่ใช่ “ล้างแบบเบา” กับ “ล้างแบบลึก” Clean Build Folder แคบและเสียต้นทุนน้อย ส่วนการลบ DerivedData กว้างกว่าและทำให้เสียดัชนีไปด้วย วิธีไหนเหมาะขึ้นอยู่กับว่าสิ่งที่เสียอยู่ในผลลัพธ์การบิลด์หรืออยู่นอกนั้น

เมื่อบิลด์พัง ให้เริ่มจากวิธีที่แคบที่สุด

ถ้าบิลด์เริ่มล้มเหลวทันทีหลังสลับ branch, เปลี่ยน build configuration หรือแก้ไฟล์ resource ให้ปิดแอปที่กำลังรันอยู่ แล้วใช้ Clean Build Folder ก่อน เพราะเป็นการรีเซ็ตที่เสียต้นทุนน้อยที่สุด ดัชนียังอยู่ และกลับมาทำงานได้หลังบิลด์เพียงครั้งเดียว ไม่ต้องรอการทำดัชนีอีกหลายนาที

ขยับไปลบโฟลเดอร์ DerivedData ของโปรเจกต์นั้นเมื่ออาการไม่ได้เกี่ยวกับผลลัพธ์การบิลด์จริง ๆ เช่น Xcode ยังแสดงข้อผิดพลาดของโค้ดที่แก้ไปแล้ว, jump to definition พาไปผิดที่ หรือ code completion ไม่รู้จักชนิดข้อมูล (type) ที่คุณเขียนเอง อาการเหล่านี้มาจากดัชนี และ Clean Build Folder ไม่แตะดัชนี

มีกรณีหนึ่งที่ควรรู้ เพราะมักเป็นเหตุผลที่ “ล้างแล้วไม่หาย” กลายเป็น “ลบ DerivedData แล้วหาย” แคชโมดูลที่คอมไพล์ไว้ล่วงหน้า (ModuleCache.noindex) อยู่ที่ระดับบนสุดของ DerivedData ไม่ได้อยู่ในโฟลเดอร์ย่อยของโปรเจกต์ใด Clean Build Folder จึงเข้าไม่ถึง เมื่อแคชโมดูลล้าสมัยหลังเปลี่ยน SDK หรือ toolchain การลบแคชนี้เท่านั้นที่ทำให้ข้อผิดพลาดหายไป

ทั้งสองวิธีไม่ได้แก้บั๊กจริงในซอร์สหรือ dependency ของคุณ ถ้าข้อผิดพลาดเดิมยังอยู่หลัง clean build ให้หยุดล้างแล้วอ่านข้อความจากคอมไพเลอร์ สาเหตุอยู่ที่การตั้งค่าโปรเจกต์, Package.resolved, SDK ที่เลือก หรือตัวโค้ดเอง

ทั้งสองวิธีไม่ใช่กลยุทธ์ล้างพื้นที่ดิสก์

Clean Build Folder เป็นเครื่องมือวินิจฉัยที่บังเอิญคืนพื้นที่ได้บ้าง อาจได้พื้นที่คืนจากโปรเจกต์ปัจจุบัน แต่ผลลัพธ์การบิลด์ของโปรเจกต์อื่นทั้งหมด ดัชนีทุกชุด และแคชโมดูลยังอยู่ที่เดิม การใช้คำสั่งนี้เพื่อคืนพื้นที่ดิสก์จึงแก้ผิดจุด

ถ้าเป้าหมายคือพื้นที่จริง ให้ทำกลับกัน วัดขนาดโฟลเดอร์ย่อยใน DerivedData ก่อน แล้วลบของโปรเจกต์ที่ไม่ได้เปิดมาหลายเดือน พื้นที่หลายสิบกิกะไบต์มักอยู่ตรงนั้น คือโปรเจกต์ที่โคลนมาบิลด์ครั้งเดียวแล้วไม่ได้กลับไปเปิดอีก

อย่าเริ่มด้วย rm -rf ให้ใช้ Finder ย้ายโฟลเดอร์ที่เลือกไปถังขยะ ซึ่งยังกู้คืนได้จนกว่าจะล้างถังขยะ ข้อดีนี้สำคัญมากในครั้งแรกที่คุณเผลอลบโฟลเดอร์ของโปรเจกต์ที่กลายเป็นว่ากำลังบิลด์อยู่ เทอร์มินัลเหมาะกับงานอัตโนมัติ แต่ควรใช้หลังจากยืนยันพาธที่แน่นอนแล้วเท่านั้น

ตรวจผลลัพธ์จริงแทนการเชื่อตัวเลข

จดขนาด DerivedData ก่อนเริ่ม เลือกใช้เพียงวิธีเดียวจากสองวิธีนี้ แล้ววัดอีกครั้ง หลังใช้ Clean Build Folder ให้บิลด์ scheme ปัจจุบัน หลังลบโฟลเดอร์ DerivedData ให้เปิด Xcode แล้วรอให้การบิลด์ครั้งแรกและการทำดัชนีเสร็จ

การทำตามลำดับนี้ช่วยแยกให้เห็นว่าได้พื้นที่คืนเท่าไร และต้องแลกกับอะไรเพื่อให้ได้พื้นที่นั้น ไม่มีตัวเลขกลางที่คาดหวังได้ ผลลัพธ์ขึ้นกับจำนวนโปรเจกต์, configuration และสถาปัตยกรรมที่เคยบิลด์บน Mac เครื่องนั้น

ควรใช้วิธีไหน

สถานการณ์สิ่งที่ควรทำต้นทุนในการกู้คืน
บิลด์ของ scheme ปัจจุบันล้มเหลวProduct > Clean Build Folderบิลด์โปรเจกต์นี้ใหม่หนึ่งครั้ง ดัชนีของทุกโปรเจกต์ยังอยู่
ข้อผิดพลาดค้าง หรือ jump to definition ใช้ไม่ได้~/Library/Developer/Xcode/DerivedData/<project>บิลด์ใหม่ทั้งหมดและทำดัชนีใหม่ เฉพาะโปรเจกต์นั้น
ข้อผิดพลาดยังอยู่หลัง Clean Build Folder เมื่อเปลี่ยน SDK~/Library/Developer/Xcode/DerivedData/ModuleCache.noindexโมดูลจะถูกคอมไพล์ใหม่ในการบิลด์ครั้งถัดไป Clean Build Folder เข้าไม่ถึงตำแหน่งนี้
ต้องการพื้นที่ดิสก์จริง ๆ~/Library/Developer/Xcode/DerivedDataลบโฟลเดอร์ย่อยขนาดใหญ่ที่ไม่ได้ใช้แล้ว โปรเจกต์เหล่านั้นจะบิลด์ใหม่เมื่อเปิดครั้งถัดไป
รันไทม์ Simulator เก่าXcode Settings > Componentsเป็นอีกหมวดหนึ่งโดยสิ้นเชิง ทั้งสองคำสั่งไม่แตะส่วนนี้

ตารางนี้อธิบายขอบเขต ไม่ได้สัญญาว่าจะได้พื้นที่คืนกี่กิกะไบต์ ให้วัด Mac ของคุณเองทั้งก่อนและหลัง

คำถามที่พบบ่อย

Clean Build Folder ลบ DerivedData หรือไม่?

ไม่ คำสั่งนี้ล้างผลลัพธ์การบิลด์ของโปรเจกต์และ scheme ที่เปิดอยู่ ซึ่งไม่เท่ากับการลบไดเรกทอรี DerivedData ที่ใช้ร่วมกัน เพราะไดเรกทอรีนั้นยังเก็บดัชนี แคชโมดูล และบันทึกของทุกโปรเจกต์

ลบโฟลเดอร์ DerivedData ของโปรเจกต์เดียวปลอดภัยไหม?

ปลอดภัย ทุกอย่างในนั้นสร้างจากซอร์สของคุณ และ Xcode สร้างใหม่ได้ โค้ดและประวัติ git ไม่ได้รับผลกระทบ ต้นทุนมีเพียงว่าการบิลด์ครั้งแรกหลังจากนั้นจะเป็นการบิลด์เต็ม ตามด้วยการทำดัชนีใหม่

ต้องออกจาก Xcode ก่อนไหม?

ถ้าลบ DerivedData ด้วยตัวเอง ควรออกก่อน เพื่อไม่ให้ตัวทำดัชนีเปิดไฟล์ค้างหรือสร้างไฟล์ขึ้นใหม่ระหว่างที่คุณลบ ส่วนคำสั่ง Clean Build Folder ในตัวไม่ต้องออก เพราะ Xcode จัดการกับไฟล์ของตัวเอง

ทำไมล้างแล้วข้อผิดพลาดยังอยู่?

ส่วนใหญ่เป็นเพราะสาเหตุไม่ได้อยู่ที่แคชตั้งแต่แรก ให้ตรวจข้อความจากคอมไพเลอร์, การตั้งค่า scheme, เวอร์ชันของ dependency, Package.resolved, SDK ที่เลือก และสิ่งที่เปลี่ยนไปใน branch ปัจจุบัน

Clean Build Folder ไม่ช่วย แต่ลบ DerivedData แล้วหาย เพราะอะไร?

ส่วนใหญ่เป็นเพราะแคชโมดูลที่คอมไพล์ไว้ล่วงหน้า ModuleCache.noindex อยู่ที่ระดับบนสุดของ DerivedData ไม่ได้อยู่ในโฟลเดอร์ย่อยของโปรเจกต์ Clean Build Folder จึงเข้าไม่ถึง แต่การลบ DerivedData ลบส่วนนี้ไปด้วย

แหล่งอ้างอิง

จัดการพื้นที่ของ Xcode ต่อ