AskCleanAskClean

ลบ Xcode DerivedData และแคชของนักพัฒนาอย่างปลอดภัย

AskClean Team · Updated 2026-07-18

DerivedData คือโฟลเดอร์ทดของ Xcode สำหรับผลลัพธ์การบิลด์และดัชนี และมันโตเงียบ ๆ จนถึงหลายสิบกิกะไบต์ได้ ลบได้อย่างปลอดภัย: ออกจาก Xcode ลบเนื้อหาใน ~/Library/Developer/Xcode/DerivedData แล้ว Xcode จะสร้างทุกอย่างใหม่ในการบิลด์ครั้งถัดไป คู่มือนี้ครอบคลุมเรื่องนั้น รวมถึง Simulator, Archives และแคชแพ็กเกจ

DerivedData คืออะไร ทำไมมันถึงใหญ่มโหฬาร

DerivedData คือที่ที่ Xcode เก็บทุกอย่างที่มันสังเคราะห์ (derive) มาจากซอร์สโค้ดของคุณ: อ็อบเจ็กต์บิลด์ระหว่างทาง ผลิตภัณฑ์ที่คอมไพล์แล้ว แคชโมดูล ดัชนีสัญลักษณ์สำหรับ code completion กับการกระโดดไปยังนิยาม และบันทึกการบิลด์ โดยค่าเริ่มต้นมันอยู่ที่ ~/Library/Developer/Xcode/DerivedData แยกโฟลเดอร์ย่อยหนึ่งอันต่อโปรเจกต์หรือ workspace ทุกอันที่คุณเคยเปิด

มันโตขึ้นด้วยเหตุผลเชิงโครงสร้าง: Xcode สร้างโฟลเดอร์ DerivedData ให้ทุกโปรเจกต์ที่คุณเปิด — รวมถึงโค้ดที่โคลนมาบิลด์ครั้งเดียวแล้วไม่แตะอีกเลย — และมันไม่เคยลบอันไหนทิ้ง แต่ละโฟลเดอร์เก็บผลลัพธ์บิลด์แยกตาม configuration และปลายทาง (Debug กับ Release, Simulator กับอุปกรณ์จริง) โปรเจกต์ขนาดกลางโปรเจกต์เดียวจึงกินได้หลายกิกะไบต์ และทั้งโฟลเดอร์มักไปถึง 20-50 GB บนเครื่องพัฒนาที่ใช้งานจริง

ทุกอย่างข้างในสร้างใหม่ได้ตามนิยาม — นั่นแหละคือความหมายของคำว่า "derived" การลบ DerivedData ไม่มีวันแตะซอร์สโค้ด การตั้งค่าโปรเจกต์ หรืออะไรก็ตามที่อยู่ใน version control ของคุณ ต้นทุนเดียวคือเวลา: การบิลด์ครั้งถัดไปของแต่ละโปรเจกต์จะเป็น clean build เต็มรูปแบบ และการทำดัชนีจะรันเบื้องหลังอีกไม่กี่นาที

ลบ DerivedData

มีสามวิธี และปลายทางเหมือนกัน คำสั่ง Clean Build Folder ของ Xcode (Product > Clean Build Folder หรือ Command-Shift-K) ล้างแค่ผลลัพธ์บิลด์ของโปรเจกต์ที่เปิดอยู่ตอนนั้น — มีประโยชน์เวลาแก้บิลด์เพี้ยน ๆ แต่แทบไม่ขยับเข็มเรื่องพื้นที่ดิสก์ ถ้าจะเอาพื้นที่คืนจริง ๆ ต้องลบตัวโฟลเดอร์ DerivedData เอง

ลบทีละโปรเจกต์คือทางเลือกแบบผ่าตัด: เก็บ DerivedData ของสองสามโปรเจกต์ที่คุณบิลด์ทุกวันไว้ แล้วลบโฟลเดอร์ของที่เหลือทั้งหมด ส่วนลบทั้งก้อนคือทางเลือกแบบเร็ว และก็โอเคเหมือนกัน — เพียงแต่คุณจ่ายต้นทุน rebuild เต็มรูปแบบกับทุกโปรเจกต์พร้อมกัน

  1. ออกจาก Xcode ก่อน การลบ DerivedData ขณะ Xcode กำลังทำงานอาจทำให้ตัวทำดัชนีของมันสับสน และไฟล์ที่ Xcode เปิดค้างอยู่อาจลบไม่สะอาด
  2. หาโฟลเดอร์: ใน Xcode เปิด Settings > Locations แล้วคลิกลูกศรเล็ก ๆ ข้างพาธ DerivedData เพื่อเปิดดูใน Finder หรือใน Finder กด Command-Shift-G แล้วพิมพ์ ~/Library/Developer/Xcode/DerivedData ตรง ๆ เลยก็ได้
  3. เรียงโฟลเดอร์ย่อยของโปรเจกต์ตามขนาด เลือกอันที่อยากกำจัด (หรือ Command-A เลือกทั้งหมด) แล้วย้ายลงถังขยะ ลงถังขยะก่อนคือนิสัยที่ปลอดภัยกว่า — เปลี่ยนใจเมื่อไหร่ก็กู้คืนได้ทันที
  4. จะใช้ Terminal แทนก็ได้: rm -rf ~/Library/Developer/Xcode/DerivedData ลบทั้งหมดในคำสั่งเดียว เร็วกว่า Finder สำหรับโฟลเดอร์ใหญ่มาก ๆ แต่อ่านหมายเหตุด้านล่างก่อนใช้
  5. เปิด Xcode ใหม่แล้วบิลด์ คาดไว้เลยว่าการบิลด์ครั้งแรกของแต่ละโปรเจกต์จะนานกว่าปกติชัดเจน และ "Indexing" จะรันในแถบกิจกรรมอยู่พักใหญ่ — ทั้งคู่เป็นต้นทุนครั้งเดียว

ระวัง rm -rf ให้ดี: มันข้ามถังขยะและลบถาวรทันที ไม่มี undo พิมพ์พาธให้ตรงเป๊ะ อย่ารันด้วย sudo สำหรับงานนี้เด็ดขาด และถ้าไม่ถนัด Terminal เส้นทางผ่าน Finder ทำงานเดียวกันแบบย้อนกลับได้

ล้างรันไทม์ Simulator เก่า

Simulator มักเป็นตัวกินพื้นที่ของนักพัฒนาอันดับสองรองจาก DerivedData รันไทม์ iOS, watchOS หรือ tvOS ทุกรุ่นที่คุณเคยดาวน์โหลดกินพื้นที่ 5-8 GB และอุปกรณ์จำลองแต่ละเครื่องยังมีโฟลเดอร์ข้อมูลของตัวเองใต้ ~/Library/Developer/CoreSimulator/Devices ถ้าคุณผ่านการอัปเกรด Xcode มาสักสองสามรอบ ก็น่าจะมีรันไทม์ของ iOS เวอร์ชันที่เลิกพัฒนาเจาะจงไปหลายปีแล้วค้างอยู่

ชัยชนะที่เร็วสุดคือคำสั่งล้างในตัว: รัน xcrun simctl delete unavailable ใน Terminal มันจะลบอุปกรณ์ Simulator ทุกเครื่องที่รันไทม์ของมันไม่ได้ติดตั้งอยู่แล้ว — พวกลูกกำพร้าที่ Xcode เวอร์ชันเก่าทิ้งไว้ — และไม่แตะอะไรที่คุณยังใช้ได้อยู่เลย

สำหรับตัวรันไทม์เอง เปิด Settings > Platforms ของ Xcode (Xcode รุ่นเก่าเรียก Components) คุณจะเห็นรันไทม์ Simulator ที่ติดตั้งอยู่แต่ละรุ่นพร้อมขนาด เลือกรุ่นเก่าแล้วลบทิ้งได้เลย เก็บไว้แค่รันไทม์ล่าสุดของแต่ละแพลตฟอร์ม เว้นแต่คุณทดสอบบน OS รุ่นเก่าจริง ๆ

คุณยังตัดแต่งอุปกรณ์จำลองรายเครื่องได้ใน Window > Devices and Simulators: สลับไปแท็บ Simulators คลิกขวาอุปกรณ์ที่ไม่เคยใช้ — พวก iPhone รุ่นซ้ำหกเครื่องพร้อมข้อมูลจากการทดสอบรอบเก่า — แล้วเลือก Delete ข้อมูลและแอปที่บันทึกไว้ของอุปกรณ์นั้นจะหายไปด้วยกัน

Archives, ไฟล์ Device Support และแคช

Archives สะสมอยู่ที่ ~/Library/Developer/Xcode/Archives ทุกครั้งที่คุณรัน Product > Archive เพื่อแจกจ่ายบิลด์ แต่ละ archive มีแอปบิลด์เต็มรูปแบบพร้อมสัญลักษณ์ดีบัก dSYM มักหนัก 100 MB ถึง 1 GB ต่ออัน ก่อนลบให้รู้ข้อแลกเปลี่ยน: dSYM ข้างในคือสิ่งที่ทำให้คุณ symbolicate รายงานการขัดข้องของบิลด์นั้น ๆ ได้ เก็บ archive ของเวอร์ชันที่ยังออนไลน์บน App Store หรือ TestFlight ไว้ (หรือยืนยันว่า App Store Connect มี dSYM แล้ว) แล้วลบที่เหลือ — เส้นทางปลอดภัยสุดคือ Organizer ของ Xcode (Window > Organizer > Archives) ที่คุณตรวจดูและลบพร้อมบริบทได้

iOS DeviceSupport ที่ ~/Library/Developer/Xcode/iOS DeviceSupport เก็บสัญลักษณ์ดีบักที่ Xcode คัดลอกมาจาก iPhone หรือ iPad ตัวจริงทุกเครื่องที่คุณเคยเสียบ — หนึ่งโฟลเดอร์ต่อ iOS หนึ่งเวอร์ชัน ปกติอันละ 2-5 GB โฟลเดอร์ของ iOS เวอร์ชันที่ไม่มีอุปกรณ์ของคุณใช้อยู่แล้วคือน้ำหนักส่วนเกินล้วน ๆ: ลบได้เลย และถ้าวันหนึ่งคุณต่ออุปกรณ์เวอร์ชันนั้นอีก Xcode ก็แค่คัดลอกสัญลักษณ์มาใหม่ (จะเห็น "Preparing debugger support" ครั้งหนึ่ง) มีโฟลเดอร์พี่น้องสำหรับอุปกรณ์ watchOS และ tvOS ด้วยเช่นกัน

Xcode ยังมีแคชของตัวเองใต้ ~/Library/Caches/com.apple.dt.Xcode และ Simulator เก็บของมันที่ ~/Library/Developer/CoreSimulator/Caches — ทั้งคู่ล้างได้อย่างปลอดภัยเมื่อ Xcode กับแอป Simulator ไม่ได้ทำงานอยู่ และทั้งคู่ถูกสร้างใหม่ตามต้องการ

แคชตัวจัดการแพ็กเกจ (SwiftPM, CocoaPods, npm, Homebrew)

ตัวจัดการแพ็กเกจเก็บ dependency ทุกตัวที่เคยดาวน์โหลดไว้เพื่อให้การติดตั้งครั้งหน้าเร็ว นั่นคือวิศวกรรมที่ดีแต่สุขอนามัยดิสก์ที่แย่: แคชมีแต่จะโต และบนเครื่องที่ผ่านโปรเจกต์มาหลายปี พวกมันสะสมเงียบ ๆ จนถึง 10-20 GB ทั้งหมดล้างได้อย่างปลอดภัย — กรณีแย่สุดคือการติดตั้งครั้งถัดไปต้องดาวน์โหลดแพ็กเกจใหม่

Swift Package Manager แคชแพ็กเกจที่ดาวน์โหลดไว้ที่ ~/Library/Caches/org.swift.swiftpm และ checkout ที่ resolve แล้วของแต่ละโปรเจกต์ก็อยู่ในโฟลเดอร์ DerivedData ของมันด้วย — การล้าง DerivedData จึงล้างพวกนั้นไปแล้วในตัว ส่วนแคชกลางลบจาก Finder ได้ หรือใช้ rm -rf กับพาธนั้น

CocoaPods เก็บ pod ที่ดาวน์โหลดไว้ที่ ~/Library/Caches/CocoaPods วิธีล้างแบบสะอาดคือคำสั่งในตัว: pod cache clean --all โฟลเดอร์ Pods ในโปรเจกต์ของคุณไม่ถูกแตะ หายไปแค่แคชดาวน์โหลดเท่านั้น

แคชของ npm อยู่ที่ ~/.npm และบนเครื่องสาย JavaScript อาจโตหลายกิกะไบต์ รัน npm cache clean --force เพื่อล้าง (npm บังคับใช้แฟล็กนี้เพราะแคชซ่อมตัวเองได้และปกติไม่จำเป็นต้องล้าง — แต่ลบทิ้งก็ยังปลอดภัยสมบูรณ์) ผู้ใช้ pnpm ใช้ pnpm store prune แทน

Homebrew กักตุนไฟล์ดาวน์โหลดเก่าและแพ็กเกจเวอร์ชันตกรุ่น brew cleanup ลบเวอร์ชันตกรุ่นและไฟล์ดาวน์โหลดค้างเก่า; brew cleanup --prune=all ล้างแคชดาวน์โหลดทั้งหมดด้วย อยากดูรายการแบบซ้อมก่อน (dry-run) ว่าจะหายอะไรบ้าง ให้รัน brew cleanup -n ก่อน

ทำให้เป็นอัตโนมัติ

ทุกอย่างข้างบนได้ผลจริง แต่ขยะของนักพัฒนาเป็นลู่วิ่งไม่มีวันจบ: DerivedData กลับมาภายในหนึ่งสัปดาห์ของการทำงานปกติ แคชเติมกลับ และการอัปเดต Xcode แต่ละรอบก็ทิ้งรันไทม์เกยตื้นเพิ่มอีกตัว ถ้าไม่อยากไล่ทำหกขั้นตอนด้วยมือใหม่ทุกเดือน นี่คือส่วนที่คุ้มจะทำให้อัตโนมัติ — ด้วยเครื่องมือที่แสดงเหตุผลของมัน แทนที่จะลบทีละเข่งแบบเงียบ ๆ

AskClean ปฏิบัติต่อไฟล์ของนักพัฒนาเป็นหมวดชั้นหนึ่ง: สแกนครั้งเดียวก็แจกแจง Xcode DerivedData รายโปรเจกต์ รันไทม์ Simulator เก่า (อ่านผ่าน simctl เก็บรุ่นล่าสุดของแต่ละแพลตฟอร์มไว้) ไฟล์ Device Support และแคชตัวจัดการแพ็กเกจของ npm, SwiftPM, cargo, uv และอื่น ๆ มันยังจับตัวกินพื้นที่หน้าใหม่ด้วย — แคชโมเดล Hugging Face และ Ollama — ที่มันแสดงรายการรายโมเดลและไม่ติ๊กเลือกให้โดยค่าเริ่มต้น

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

FAQ

ลบ DerivedData ปลอดภัยไหม?

ปลอดภัย — เป็นหนึ่งในการลบก้อนใหญ่ที่ปลอดภัยที่สุดบน Mac เลย DerivedData มีแต่ไฟล์ที่ Xcode สร้างจากซอร์สของคุณ: ผลลัพธ์บิลด์ แคชโมดูล ดัชนี และบันทึก โค้ด ไฟล์โปรเจกต์ และประวัติ git ของคุณอยู่ที่อื่นและไม่ได้รับผลกระทบเลย ผลตามมาอย่างเดียวคือการบิลด์ครั้งถัดไปของแต่ละโปรเจกต์เป็น rebuild เต็มรูปแบบ และการทำดัชนีรันใหม่อีกรอบ

ควรล้าง DerivedData บ่อยแค่ไหน?

ไม่มีตารางบังคับ — ล้างเมื่อมันใหญ่จนมีนัยสำคัญ ซึ่งสำหรับนักพัฒนาที่ทำงานสม่ำเสมอส่วนใหญ่คือทุกหนึ่งถึงสองเดือน สองจังหวะที่ล้างแล้วคุ้มเสมอ: ตอนต้องการพื้นที่ดิสก์ด่วน และตอนโปรเจกต์มีบิลด์พังแบบอธิบายไม่ได้หรือ code completion ค้างของเก่า ซึ่งการล้าง DerivedData คือวิธีแก้มาตรฐานอันดับแรก

หลังลบ DerivedData แล้ว Xcode จะช้าลงไหม?

ชั่วคราวใช่ การบิลด์ครั้งแรกของแต่ละโปรเจกต์เป็น clean build ซึ่งอาจนานกว่าบิลด์แบบ incremental หลายเท่า และการทำดัชนีเบื้องหลังต้องใช้อีกไม่กี่นาทีกว่า code completion กับการค้นหาจะกลับมาเต็มรูปแบบ พ้นรอบแรกนั้นไป ประสิทธิภาพจะเหมือนเดิมทุกประการ — DerivedData เก็บแคช ไม่ใช่การปรับแต่งที่คุณเสียไปถาวร

แล้ว ~/Library/Developer/CoreSimulator ล่ะ — ลบได้ไหม?

ห้ามลบสุ่มสี่สุ่มห้า — มันเก็บ Simulator ที่ติดตั้งอยู่ตอนนี้พร้อมข้อมูลของพวกมัน ลบยกโฟลเดอร์จะทำให้ใช้งานไม่ได้จนกว่าจะติดตั้งรันไทม์ใหม่ ให้ตัดแต่งอย่างถูกวิธีแทน: รัน xcrun simctl delete unavailable สำหรับอุปกรณ์กำพร้า ลบรันไทม์เก่าใน Settings > Platforms ของ Xcode ลบอุปกรณ์ที่ไม่ใช้ใน Devices and Simulators และล้างด้วยมือเฉพาะโฟลเดอร์ย่อย Caches เท่านั้น

Clean Build Folder ทำสิ่งเดียวกันไหม?

ไม่ Product > Clean Build Folder (Command-Shift-K) ล้างแค่ผลลัพธ์บิลด์ของโปรเจกต์ปัจจุบัน และปล่อยดัชนี แคชโมดูล กับโฟลเดอร์ของโปรเจกต์อื่น ๆ ทั้งหมดไว้ตามเดิม มันคือเครื่องมือแก้ปัญหาบิลด์ ไม่ใช่เครื่องมือกู้พื้นที่ดิสก์ — จะเอาพื้นที่คืนจริง ๆ ต้องลบตัวโฟลเดอร์ DerivedData เอง

Sources