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.
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.
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:
- Obj-C kodu oluşturur
- Swift kodu oluştur
Obj-C / Swift köprüsü:
- [REPEATABLE STEP] Obj-C kodunu derlemek için gerekli olan Swift kodunu oluşturun
- [REPEATABLE STEP] Swift kodunu derlemek için gereken Obj-C kodunu oluşturun
- Yalnızca güvenilir olmayan Swift ve Obj-C kodu kalmayıncaya kadar 1 ve 2'yi tekrarlayın
- Obj-C kodu oluşturma
- Swift kodu oluştur
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.