วิธีล้างแคช Swift Package Manager อย่างปลอดภัย
ทีม AskClean · อัปเดตเมื่อ 2026-11-02
ใช้ swift package clean ล้างไฟล์ผลลัพธ์การบิลด์ของโปรเจกต์เดียว ใช้ swift package reset ล้างแคชและไดเรกทอรีบิลด์ทั้งหมดของแพ็กเกจนั้น และใช้ swift package purge-cache กับแคชรีโพซิทอรีที่ SwiftPM ใช้ร่วมกันทุกโปรเจกต์ เก็บ Package.swift และ Package.resolved ไว้เสมอ เพราะสองไฟล์นี้กำหนด dependency ไม่ใช่แคชที่ลบทิ้งได้

แคชของ SwiftPM มีหลายชั้น
แพ็กเกจที่บิลด์ด้วย command line มักมีโฟลเดอร์ .build ที่เก็บ checkout, รีโพซิทอรี, ผลลัพธ์การบิลด์ และสถานะ workspace SwiftPM ยังมีแคชรีโพซิทอรีส่วนกลาง เพื่อไม่ให้หลายโปรเจกต์ต้องดาวน์โหลด dependency เดิมซ้ำ และเมื่อแอปใน Xcode ใช้ Swift package นั้น checkout กับผลลัพธ์การบิลด์มักอยู่ใน DerivedData ของโปรเจกต์ ให้ล้างชั้นที่แคบที่สุดที่อธิบายอาการได้ อย่าข้ามจากบิลด์ล้มเหลวครั้งเดียวไปลบแคชส่วนกลางทั้งหมด การล้างระดับโปรเจกต์กู้คืนเร็วกว่า มักใช้ได้แม้ออฟไลน์ และไม่ทำให้รีโพซิทอรีอื่นช้าลง
เลือกคำสั่งตามขอบเขต
swift package clean ลบไฟล์ผลลัพธ์การบิลด์ของแพ็กเกจปัจจุบัน เป็นขั้นแรกเมื่อเจอไฟล์ที่คอมไพล์ไว้ล้าสมัย ปัญหา linker ที่อธิบายไม่ได้ หรือต้องการคืนพื้นที่เฉพาะรีโพซิทอรีเดียว swift package reset รีเซ็ตแคชและไดเรกทอรีบิลด์ทั้งหมดของแพ็กเกจ จึงกว้างกว่าและอาจต้องเตรียม dependency กับสถานะ workspace ใหม่ ใช้เมื่อ clean แก้ไม่ได้ ส่วน swift package purge-cache ล้างแคชรีโพซิทอรีส่วนกลาง การ resolve หรือบิลด์ครั้งถัดไปของหลายโปรเจกต์จึงอาจต้องต่อเครือข่ายและใช้เวลานานขึ้น อย่าใช้เป็นขั้นตอนประจำก่อนบิลด์
- commit หรือ stash การเปลี่ยนแปลงในซอร์สก่อน แล้วตรวจว่า Package.swift และ Package.resolved อยู่ในตำแหน่งที่โปรเจกต์ต้องการ
- ที่ root ของแพ็กเกจ รัน swift package clean แล้วลองบิลด์เดิมอีกครั้ง
- หาก workspace ของแพ็กเกจยังไม่สอดคล้อง ให้รัน swift package reset แล้ว resolve และบิลด์ใหม่
- รัน swift package purge-cache เฉพาะเมื่อแคชรีโพซิทอรีส่วนกลางใหญ่ผิดปกติหรือเสียหาย
- ตรวจกราฟ dependency และบิลด์ให้ผ่าน ก่อนพิจารณาล้าง DerivedData ของ Xcode
คำสั่งย่อยที่ใช้ได้ขึ้นกับ Swift toolchain ที่ติดตั้ง ให้รัน swift package --help เพื่อตรวจว่า Mac เครื่องนั้นรองรับคำสั่งใดบ้าง
เก็บ Package.resolved ไว้ เว้นแต่ตั้งใจอัปเดตเวอร์ชัน
Package.resolved คือสถานะการ resolve dependency ไม่ใช่แคชดาวน์โหลด สำหรับแอป การ commit ไฟล์นี้ช่วยให้ทีมและ CI ใช้เวอร์ชันเดียวกัน หากลบ การ resolve ครั้งถัดไปอาจเลือกเวอร์ชันอื่นที่ Package.swift อนุญาต การล้างพื้นที่จึงกลายเป็นการอัปเกรด dependency โดยไม่ตั้งใจ ส่วน Package.swift, Sources, Tests, plugins และ local path dependency เป็นไฟล์ต้นฉบับ ห้ามลบหรือแก้ไขเพื่อล้างแคช เนื้อหาใน .build สร้างกลับมาได้ แต่ไฟล์ที่คุณเขียนเองอาจกู้คืนไม่ได้
ล้าง Swift package ที่ Xcode ใช้
หากปัญหาเกิดเฉพาะใน Xcode ให้เริ่มจาก File > Packages > Reset Package Caches (ถ้า Xcode รุ่นที่ใช้มีคำสั่งนี้) แล้วใช้ File > Packages > Resolve Package Versions เพื่อคืนกราฟ dependency ตามโปรเจกต์และไฟล์ resolve ชื่อเมนูอาจต่างกันตามรุ่น หากปัญหาอยู่ที่ไฟล์ที่คอมไพล์แล้ว ให้ลบเฉพาะ DerivedData ของโปรเจกต์นั้นผ่าน Xcode Settings > Locations หรือ Finder ไม่ต้องลบ DerivedData ทั้งหมด ถ้าในเครื่องมี Xcode หลายรุ่น ให้เปิดรุ่นที่ตั้งใจใช้ก่อน resolve AskClean ช่วยหาว่าหมวดใดรอบ ๆ SwiftPM ใช้พื้นที่มาก แต่ขอบเขตของแคช SwiftPM ให้ยึดตามคำสั่ง Swift อย่างเป็นทางการ
สรุปการตัดสินใจและขอบเขตความปลอดภัย
ล้างแคช Swift Package Manager (SPM) อย่างปลอดภัย รู้ว่าเมื่อใดควรใช้ swift package clean, reset หรือ purge-cache และวิธีเก็บ Package.resolved ไว้
| การตัดสินใจ | ตรวจสอบได้ที่ | ขอบเขตความปลอดภัย |
|---|---|---|
| แคชของ SwiftPM มีหลายชั้น | .build / DerivedData / แคชรีโพซิทอรี | แพ็กเกจที่บิลด์ด้วย command line มักมีโฟลเดอร์ .build ที่เก็บ checkout, รีโพซิทอรี, ผลลัพธ์การบิลด์ และสถานะ workspace SwiftPM ยังมีแคชรีโพซิทอรีส่วนกลาง เพื่อไม่ให้หลายโปรเจกต์ต้องดาวน์โหลด dependency เดิมซ้ำ และเมื่อแอปใน Xcode ใช้ Swift package นั้น checkout กับผลลัพธ์การบิลด์มักอยู่ใน DerivedData ของโปรเจกต์ ให้ล้างชั้นที่แคบที่สุดที่อธิบายอาการได้ อย่าข้ามจากบิลด์ล้มเหลวครั้งเดียวไปลบแคชส่วนกลางทั้งหมด การล้างระดับโปรเจกต์กู้คืนเร็วกว่า มักใช้ได้แม้ออฟไลน์ และไม่ทำให้รีโพซิทอรีอื่นช้าลง |
| เลือกคำสั่งตามขอบเขต | swift package clean / reset / purge-cache | swift package clean ลบไฟล์ผลลัพธ์การบิลด์ของแพ็กเกจปัจจุบัน เป็นขั้นแรกเมื่อเจอไฟล์ที่คอมไพล์ไว้ล้าสมัย ปัญหา linker ที่อธิบายไม่ได้ หรือต้องการคืนพื้นที่เฉพาะรีโพซิทอรีเดียว swift package reset รีเซ็ตแคชและไดเรกทอรีบิลด์ทั้งหมดของแพ็กเกจ จึงกว้างกว่าและอาจต้องเตรียม dependency กับสถานะ workspace ใหม่ ใช้เมื่อ clean แก้ไม่ได้ ส่วน swift package purge-cache ล้างแคชรีโพซิทอรีส่วนกลาง การ resolve หรือบิลด์ครั้งถัดไปของหลายโปรเจกต์จึงอาจต้องต่อเครือข่ายและใช้เวลานานขึ้น อย่าใช้เป็นขั้นตอนประจำก่อนบิลด์ |
| เก็บ Package.resolved ไว้ เว้นแต่ตั้งใจอัปเดตเวอร์ชัน | Package.swift / Package.resolved | Package.resolved คือสถานะการ resolve dependency ไม่ใช่แคชดาวน์โหลด สำหรับแอป การ commit ไฟล์นี้ช่วยให้ทีมและ CI ใช้เวอร์ชันเดียวกัน หากลบ การ resolve ครั้งถัดไปอาจเลือกเวอร์ชันอื่นที่ Package.swift อนุญาต การล้างพื้นที่จึงกลายเป็นการอัปเกรด dependency โดยไม่ตั้งใจ ส่วน Package.swift, Sources, Tests, plugins และ local path dependency เป็นไฟล์ต้นฉบับ ห้ามลบหรือแก้ไขเพื่อล้างแคช เนื้อหาใน .build สร้างกลับมาได้ แต่ไฟล์ที่คุณเขียนเองอาจกู้คืนไม่ได้ |
| ล้าง Swift package ที่ Xcode ใช้ | File > Packages / DerivedData | หากปัญหาเกิดเฉพาะใน Xcode ให้เริ่มจาก File > Packages > Reset Package Caches (ถ้า Xcode รุ่นที่ใช้มีคำสั่งนี้) แล้วใช้ File > Packages > Resolve Package Versions เพื่อคืนกราฟ dependency ตามโปรเจกต์และไฟล์ resolve ชื่อเมนูอาจต่างกันตามรุ่น หากปัญหาอยู่ที่ไฟล์ที่คอมไพล์แล้ว ให้ลบเฉพาะ DerivedData ของโปรเจกต์นั้นผ่าน Xcode Settings > Locations หรือ Finder ไม่ต้องลบ DerivedData ทั้งหมด ถ้าในเครื่องมี Xcode หลายรุ่น ให้เปิดรุ่นที่ตั้งใจใช้ก่อน resolve AskClean ช่วยหาว่าหมวดใดรอบ ๆ SwiftPM ใช้พื้นที่มาก แต่ขอบเขตของแคช SwiftPM ให้ยึดตามคำสั่ง Swift อย่างเป็นทางการ |
คำถามที่พบบ่อย
swift package clean ลบอะไร?
ลบไฟล์ผลลัพธ์การบิลด์ของแพ็กเกจปัจจุบัน ไม่ลบ Package.swift และไม่ได้เปลี่ยนข้อกำหนดเวอร์ชันของ dependency การบิลด์ครั้งถัดไปจะสร้างไฟล์เหล่านั้นใหม่
reset กับ purge-cache ต่างกันอย่างไร?
reset ล้างแคชและไดเรกทอรีบิลด์ทั้งหมดของแพ็กเกจปัจจุบัน ส่วน purge-cache ล้างแคชรีโพซิทอรีส่วนกลางของ SwiftPM ซึ่งมีผลกว้างกว่า เพราะหลายโปรเจกต์อาจต้องดาวน์โหลด dependency ใหม่
ควรลบ Package.resolved ไหม?
ไม่ควรสำหรับการล้างทั่วไป ไฟล์นี้บันทึกเวอร์ชัน dependency ที่ resolve แล้ว การลบอาจทำให้ครั้งหน้าได้เวอร์ชันอื่น ลบเฉพาะเมื่อตั้งใจ resolve ใหม่จริง ๆ
แหล่งอ้างอิง