Xcode DerivedData nasıl güvenle silinir?

DerivedData, Xcode'un çalışma alanı: açtığın her projenin derleme çıktıları, indeksi, günlükleri ve paket kopyaları burada. Hepsi yeniden üretilebildiği için geliştirici Mac'inde boşaltması en güvenli büyük klasör bu.

Güncelleme:

DerivedData nedir

Xcode bir projeyi her açtığında, indekslediğinde ya da derlediğinde sonuçları ~/Library/Developer/Xcode/DerivedData içine yazar. Burada kaynak kod yok; hepsi Xcode'un projenden yeniden üretebileceği çıktılar. Yani silince emeğin kaybolmaz. Sorun şu: Xcode bu klasörü kendiliğinden hiç temizlemez. İki yıl önce bir kez açtığın projenin klasörü hâlâ orada durur.

Bir geliştiricinin Mac'inde ölçtüğümüzde DerivedData yüzü aşkın klasöre yayılmış 17 GB tutuyordu. En büyükleri genelde sık derlediğin projeler, çok sayıda Swift paketi kullanan uygulamalar ve Flutter'ın iOS derlemeleri oluyor (bunlar Runner-… adıyla görünür).

İçinde neler var

Her proje, adı ve rastgele görünen bir ekle oluşan kendi klasörünü alır; örneğin MyApp-abcdefghijkl. İçinde genelde şunlar bulunur:

  • Build: her yapılandırma ve hedef için derlenmiş ürünler ve ara dosyalar.
  • Index.noindex: kod tamamlama, tanıma gitme ve aramayı besleyen indeks.
  • Logs: Report navigator'da gördüğün derleme, test ve çalıştırma günlükleri.
  • SourcePackages: projenin bağımlı olduğu Swift paketlerinin kopyaları.

Proje klasörlerinin yanında tüm projelerin ortak kullandığı önbellekler de durur. ModuleCache.noindex önceden derlenmiş Clang ve Swift modüllerini tutar; yeni Xcode sürümleri bir de SDKExplicitPrecompiledModules klasörü açar. Bunlar tek başına birkaç GB olabilir ve silmeleri de aynı derecede güvenli.

Klasör adındaki ek, projenin nerede olduğunu söylemez. Ama her klasörde WorkspacePath anahtarı olan bir info.plist var; hangi klasörün hangi projeye ait olduğunu Terminal'den çıkarabilirsin:

cd ~/Library/Developer/Xcode/DerivedData
# Klasör boyutları, en büyüğü en altta
du -sh * | sort -h
# Her klasörün ait olduğu proje
for f in */info.plist; do echo "${f%%/*}  $(plutil -extract WorkspacePath raw "$f")"; done

WorkspacePath artık var olmayan bir yolu gösteriyorsa o klasör silinmiş ya da taşınmış bir projeden kalmadır; düşünmeden silebilirsin.

Xcode'un kendi yolu

Xcode'da tek tıkla DerivedData silen bir düğme yok, ama klasörün yerini gösteriyor. Xcode › Settings (⌘,) penceresini aç, Locations sekmesine geç ve Derived Data satırına bak. Yolun yanındaki küçük oka tıklarsan klasör Finder'da açılır. Daha önce konumu değiştirdiysen geçerli olan bu yoldur, varsayılan değil.

Product › Clean Build Folder (⇧⌘K) aynı şey değil. O yalnızca açık projenin derleme ürünlerini kaldırır, böylece sonraki derleme sıfırdan başlar; indeks, günlükler, paket kopyaları ve ortak modül önbelleği yerinde kalır. Derleme tuhaf davranıyorsa onu kullan, yer açmak istiyorsan DerivedData'yı sil.

Terminal'den silmek

Önce Xcode'dan çık. Xcode açıkken klasöre yazmaya devam edebilir ve açık projenin klasörünü hemen yeniden oluşturur.

# Hepsi (tüm projeler ve ortak önbellekler)
rm -rf ~/Library/Developer/Xcode/DerivedData/*

# Yalnızca bir proje (MyApp yerine klasörün ön ekini yaz)
rm -rf ~/Library/Developer/Xcode/DerivedData/MyApp-*

# Yalnızca ortak modül önbelleği
rm -rf ~/Library/Developer/Xcode/DerivedData/ModuleCache.noindex

Çöp Sepeti'ni tercih ediyorsan open ~/Library/Developer/Xcode/DerivedData ile klasörü aç ve sürükle bırak. Sonra Çöp Sepeti'ni boşaltmayı unutma, yoksa yer geri gelmez.

Proje proje silmek daha iyi bir alışkanlık. Artık üzerinde çalışmadığın projeleri temizle, her gün derlediğini bırak; yeniden derleme bedelini yalnızca karşılığını aldığın yerde ödersin.

Sildikten sonra ne olur

Hiçbir şey bozulmaz, ama her projenin bir sonraki açılışı daha yavaş olur:

  • İlk derleme tam derleme olur. Küçük bir uygulamada birkaç saniye, bağımlılığı çok olan büyük bir uygulamada dakikalar sürebilir.
  • Xcode projeyi yeniden indeksler. İndeksleme bitene kadar kod tamamlama ve tanıma gitme düzgün çalışmaz.
  • Swift paketleri yeniden çözümlenir ve indirilir; internet bağlantısı gerekebilir.
  • Report navigator'daki eski derleme günlükleri ve test sonuçları kalıcı olarak gider. Genelde lazım olmazlar, ama karşılaştırma için sakladığın bir günlük varsa önce onu kaydet.

Ne zaman silmemelisin

  • Derleme, test ya da arşivleme sürerken. Bitmesini bekle ya da durdur.
  • Xcode'dan başlattığın bir uygulama simülatörde ya da cihazda hâlâ çalışıyor ve onu debug ediyorsan.
  • Teslimden ya da demodan hemen önce, ana projenin tam derlemesi uzun sürüyorsa. Eski projeleri şimdi, aktif olanı sonra temizle.
  • Şu an temiz bir derleme yapamayacaksan; örneğin internetsizsin ve paketler önbellekte değilse.

Arşivler başka yerde

Product › Archive ile aldığın arşivler DerivedData'da değil, ~/Library/Developer/Xcode/Archives altında tarih klasörlerine ayrılmış durur ve aynı şekilde yeniden üretilemez: her arşiv yayınladığın derlemenin birebir kendisini ve o sürümün çökme raporlarını sembolize etmek için gereken dSYM dosyalarını taşır. Eski arşivleri Organizer'dan (Window › Organizer › Archives) sil; dSYM'ler başka bir yerde saklı değilse kullanıcının elinde olan her sürümün en yeni arşivini tut. Diğer büyük geliştirici klasörleri için geliştirici Mac'inde Sistem Verileri neden büyür rehberine bak.

Aynı yerdeki iOS DeviceSupport klasörü de sessizce büyür; iOS DeviceSupport nedir, hangi sürümler kalmalı rehberinde anlattım.

CleanDev ile

CleanDev'in tam sürümü (doğrudan indirme, yakında çıkıyor) DerivedData'yı ModuleCache.noindex dahil tarar ve her klasörü projesi ve boyutuyla gösterir. Tarama ücretsiz, temizlik abonelik ister. Mac App Store'daki CleanDev Lite Xcode klasörlerine dokunmaz.

  • Çalışan bir uygulamanın ya da süren bir derlemenin DerivedData'sı korunur.
  • Son bir gün içinde derlenen her şey seçilmez, incelemeye bırakılır.
  • Eski arşivler doğrudan silinmez, Çöp Sepeti'ne taşınır; en yeni arşiv ve son 90 günün arşivleri incelemeye bırakılır.

Sorular

Xcode DerivedData silmek güvenli mi?

Evet. İçinde yalnızca Xcode'un yeniden ürettiği derleme çıktıları, indeks, günlükler ve paket kopyaları var. Önce Xcode'dan çık; sonrasında ilk derlemenin yavaş olmasını bekle.

DerivedData'yı silersem kodum ya da proje ayarlarım gider mi?

Hayır. Kaynak dosyalar, .xcodeproj ya da .xcworkspace, şemalar ve imzalama ayarları proje klasöründe durur. Arşivlerin de ayrı bir klasörde.

Sildikten sonra DerivedData neden geri geliyor?

Bir projeyi açtığın ya da derlediğin anda yeniden oluşur; bu beklenen davranış. Artık açmadığın projeler için sildiğinde geri gelmez.

ModuleCache.noindex nedir, silebilir miyim?

Tüm projelerin ortak kullandığı, önceden derlenmiş modül önbelleği. Xcode kapalıyken silebilirsin; sonraki derlemeler onu yeniden oluşturur ve biraz yavaş sürer.

Derleme hatasını DerivedData silerek nasıl çözerim?

Önce Product › Clean Build Folder dene. Hata sürerse Xcode'dan çık, o projenin DerivedData klasörünü sil ve yeniden derle.

Diğer rehberler