Xcode 11 çok fazla derleniyor


12

Xcode 11, sadece yerel bir özel değişkeni değiştirsem veya yerel kapsamda, bazen yerel özel işlev kapsamında bile bir sabitin değerini değiştirsem bile tüm projemi yeniden derliyor (neredeyse?). Bazen beklendiği gibi hızlı derlemeler ile 2 veya 3 değişiklik alabilirsiniz, ama yakında yeterince her şeyi yeniden derlemeye karar verir (çok uzun sürer).

Neler olabileceği hakkında bir fikrin var mı? Xcode neyin değiştiğini belirleyemiyor mu, neden bu kadar çok başka şeyi (hatta diğer modülleri) yeniden derliyor.

Herhangi bir tavsiye çok takdir, teşekkürler!


2
Tavsiye ediyorum: Tüm modül optimizasyonu değil, artımlı bina ile hata ayıklama yapıları yaptığınızdan emin olun. Çıkın ve DerivedData'yı temizleyin. Ve Xcode 11.4'e güncelleyin, bazen o kadar hızlı derler ki ben bile görmüyorum.
matt

1
Bu konu soruya cevap verebilir: stackoverflow.com/questions/25537614/…
Endanke

Çok projeye bağımlıdır, neler olup bittiğine ilişkin derleme günlüğünü analiz etmek gerekir. Çok büyük projelerim varken Xcode 11.2+ ile böyle bir davranış gözlemlemiyorum. Proje kaynaklarınıza bir şekilde erişim sağlar mısınız, yoksa tüm tavsiyeler anlamsız olur mu?
Asperi

Eski Derleme Sistemi özelliğini kontrol edin, alt modülleri değiştirmiyorsanız işaretinin kaldırılması gerekir
BrunoLoops

Yanıtlar:


8

Aynı sorunu yaşadık ve çözdük. İki defa.

Artımlı yapı (aynı yapı makinesi):

önce: ~ 10m sonra: ~ 35s

NASIL?

Önce deneyimlerimizle başlayalım. Devasa bir Swift / Obj-C projemiz vardı ve asıl mesele buydu: inşa süreleri yavaştı ve yeni bir özellik uygulamak için yeni bir proje oluşturmanız gerekiyordu (kelimenin tam anlamıyla). Hiç çalışmayan sözdizimi vurgulaması için bonus puanlar.

teori

Bunu gerçekten düzeltmek için derleme sisteminin nasıl çalıştığını gerçekten anlamalısınız . Örneğin, bu kod snippet'ini deneyelim:

import FacebookSDK
import RxSwift
import PinLayout

ve tüm bu içe aktarma işlemlerini dosyanızda kullandığınızı hayal edin. Ve ayrıca bu dosya başka bir kütüphaneye bağlı olan başka bir dosyaya bağlıdır, bu da başka kütüphaneler vb.

Dosyanızı derlemek için Xcode, bahsettiğiniz her kütüphaneyi ve bağlı olduğu her dosyayı derlemelidir , bu nedenle "çekirdek" dosyalardan birini değiştirirseniz, Xcode'un tam anlamıyla tüm projeyi yeniden oluşturması gerekir.

Bağımlılık ağacı

Xcode derlemesi çok iş parçacıklı , ancak birçok tek iş parçacıklı ağaçtan oluşuyor .

Bu nedenle, her artımlı yapının ilk adımında Xcode, hangi dosyaların yeniden derlenmesi gerektiğine karar verir ve bir AST ağacı oluşturur . Diğer dosyalarda " güvenilir " olarak işlev gören bir dosyayı değiştirirseniz , " bağımlı " olarak işlev gören diğer tüm dosyaların yeniden derlenmesi gerekir.

Kavrama

Bu yüzden ilk öneri kuplajı düşürmektir . Proje bölümleriniz birbirinden bağımsız olmalıdır.

Obj-C / Swift köprüsü

Bir Obj-C / Swift köprüsü kullanıyorsanız, bu ağaçlarla ilgili sorun, Xcode'un normalden daha fazla aşamadan geçmesi gerekir:

Mükemmel dünya:

  1. Obj-C kodu oluşturur
  2. Swift kodu oluştur

Swift / Obj-C köprüsü

Obj-C / Swift köprüsü:

  1. [REPEATABLE STEP] Obj-C kodunu derlemek için gerekli olan Swift kodunu oluşturun
  2. [REPEATABLE STEP] Swift kodunu derlemek için gereken Obj-C kodunu oluşturun
  3. Yalnızca güvenilir olmayan Swift ve Obj-C kodu kalmayıncaya kadar 1 ve 2'yi tekrarlayın
  4. Obj-C kodu oluşturma
  5. Swift kodu oluştur

Obj-C / Swift köprüsü

Dolayısıyla, 1. veya 2. adımdan bir şeyi değiştirirseniz, temelde bir sorun yaşarsınız. En iyi çözüm Obj-C / Swift Köprüsü'nü en aza indirmektir (ve projenizden kaldırmaktır).

Bir Obj-C / Swift Köprüsü'nüz yoksa, bu harika ve bir sonraki adıma geçmeniz iyi:

Swift Paket Yöneticisi

SwiftPM'ye geçme zamanı (veya en azından Cocoapod'larınızı daha iyi yapılandırın).

Şey, varsayılan Cocoapods yapılandırmasına sahip çoğu çerçeve, ihtiyaç duymadığınız birçok şeyi kendileriyle birlikte sürükler.

Bunu test etmek için PinLayout gibi yalnızca bir bağımlılığa sahip boş bir proje oluşturun ve bu kodu Cocoapods (varsayılan yapılandırma) ve SwiftPM ile yazmaya çalışın.

import PinLayout

final class TestViewController: UIViewController {

}

Spoiler: Cocoapods bu kodu derleyecektir, çünkü Cocoapods HERHANGİ İTHALAT PinLayout'u (UIKit dahil) içe aktarır ve SwiftPM çerçeveleri atomik olarak içe aktardığı için SwiftPM olmaz.

Kirli kesmek

Xcode derlemesinin çok iş parçacıklı olduğunu hatırlıyor musunuz?

Eğer projenizi birçok bağımsız parçaya bölebilir ve hepsini projenize bağımsız çerçeveler olarak aktarabiliyorsanız, kötüye kullanabilirsiniz. Kaplini düşürür ve bu aslında kullandığımız ilk çözümdü, ama aslında çok etkili değildi, çünkü ilk yöntemle karşılaştırıldığında hiçbir artış yapma süresini sadece ~ 4-5m'ye düşürebiliriz.


İyi şanslar dostum. Projenizde kuplajı nasıl düşürdüğünüzü deneyimlerinizi paylaşın. Hoşçakal!
x0 z1

3

Burada altın mermi yok, ama kontrol edilecek çok şey var:

  • Aslında planınızda Debug yapılandırmasını kullandığınızdan emin olunHata ayıklama yapılandırmasını kullanarak Xcode Şeması Düzenleyicisi

  • Mat başına tavsiye edilen tüm modüllere göre artımlı yapıları nasıl kullandığınızdan nasıl emin olacağınız için aşağıya bakın. Ayrıca Hata Ayıklama derlemeleri için Optimizasyon Seviyenizin yok olduğundan emin olun . Artımlı Derlemeleri gösteren Xcode Derleme ayarları

  • RxSwift gibi yazımsal çıkarımlı ağır çerçeveler kullanıyorsanız, açık tür ek açıklamaları eklemek oluşturma sürelerini hızlandırabilir.

  • Proje çok büyükse, mantıksal kaynak dosya gruplarını çerçevelere yeniden düzenlemeyi düşünebilirsiniz, ancak bu, bir değişiklik için tercih ettiğinizden çok sert olabilir

Proje hakkında daha fazla ayrıntı sağladıysanız yardımcı olabilir: statik olarak herhangi bir kütüphaneyi bağlıyor musunuz? Bir çerçeve veya uygulama hedefi mi? Ne kadar büyük ve hangi hızlı sürümü kullanıyorsunuz? Bazen atlanabilecek linter veya kod oluşturma gibi özel bir Yapım Aşaması var mı?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.