Chúng tôi đã có cùng một vấn đề và chúng tôi đã sửa nó. Hai lần.
Bản dựng tăng dần (cùng bản dựng máy):
trước: ~ 10m sau: ~ 35s
LÀM SAO?
Trước tiên hãy bắt đầu với trải nghiệm của chúng tôi. Chúng tôi đã có một dự án Swift / Obj-C khổng lồ và đó là mối quan tâm chính: thời gian xây dựng chậm và bạn phải tạo một dự án mới để thực hiện một tính năng mới (theo nghĩa đen). Điểm thưởng cho đánh dấu cú pháp không bao giờ làm việc.
Học thuyết
Để thực sự khắc phục điều này, bạn phải thực sự hiểu cách xây dựng hệ thống hoạt động. Ví dụ: hãy thử đoạn mã này:
import FacebookSDK
import RxSwift
import PinLayout
và tưởng tượng bạn sử dụng tất cả các nhập khẩu này trong tệp của bạn. Và cũng tập tin này phụ thuộc vào một tập tin khác, phụ thuộc vào các thư viện khác, lần lượt sử dụng các thư viện khác, v.v.
Vì vậy, để biên dịch tệp Xcode của bạn phải biên dịch mọi thư viện bạn đã đề cập và mọi tệp mà nó phụ thuộc, vì vậy nếu bạn thay đổi một trong các tệp "lõi", Xcode phải xây dựng lại toàn bộ dự án.
Xcode build là đa luồng , nhưng nó bao gồm nhiều cây đơn luồng .
Vì vậy, ở bước đầu tiên của mỗi Xcode xây dựng gia tăng đang quyết định các tệp nào phải được biên dịch lại và xây dựng cây AST . Nếu bạn thay đổi một tệp hoạt động như " đáng tin cậy " trên các tệp khác, thì mọi tệp khác hoạt động như " phụ thuộc " phải được biên dịch lại.
Vì vậy, lời khuyên đầu tiên là hạ thấp khớp nối . Các phần dự án của bạn phải độc lập với nhau.
Cầu Obj-C / Swift
Sự cố với những cây đó nếu bạn đang sử dụng cầu Obj-C / Swift, Xcode phải trải qua nhiều giai đoạn hơn bình thường:
Thế giới hoàn hảo:
- Xây dựng mã Obj-C
- Xây dựng mã Swift
Cầu Obj-C / Swift:
- [BƯỚC REPEATABLE] Xây dựng mã Swift, cần thiết để biên dịch mã Obj-C
- [BƯỚC REPEATABLE] Xây dựng mã Obj-C, cần thiết để biên dịch mã Swift
- Lặp lại 1 & 2 cho đến khi bạn chỉ còn lại mã Swift & Obj-C không đáng tin cậy
- Xây dựng mã Obj-C
- Xây dựng mã Swift
Vì vậy, nếu bạn thay đổi điều gì đó từ bước 1 hoặc 2, về cơ bản bạn đang gặp rắc rối. Giải pháp tốt nhất là giảm thiểu Obj-C / Swift Bridge (và xóa nó khỏi dự án của bạn).
Nếu bạn không có Cầu Obj-C / Swift, điều đó thật tuyệt vời và bạn tốt để đi đến bước tiếp theo:
Quản lý gói Swift
Thời gian để chuyển sang SwiftPM (hoặc ít nhất là cấu hình Cocoapods của bạn tốt hơn).
Điều quan trọng là, hầu hết các khung với cấu hình mặc định của Cocoapod đều kéo theo rất nhiều thứ bạn không cần.
Để kiểm tra điều này, hãy tạo một dự án trống chỉ có một phụ thuộc như PinLayout, ví dụ và thử viết mã này bằng Cocoapods (cấu hình mặc định) và SwiftPM.
import PinLayout
final class TestViewController: UIViewController {
}
Spoiler: Cocoapods sẽ biên dịch mã này, bởi vì Cocoapod sẽ nhập MỌI NHẬP KHẨU PinLayout (bao gồm cả UIKit) và SwiftPM sẽ không nhập vì SwiftPM nhập khuôn khổ nguyên bản.
Hack bẩn
Bạn có nhớ bản dựng Xcode là đa luồng không?
Chà, bạn có thể lạm dụng nó, nếu bạn có thể chia dự án của bạn thành nhiều phần độc lập và nhập tất cả chúng làm khung độc lập cho dự án của bạn. Nó làm giảm khớp nối và đó thực sự là giải pháp đầu tiên chúng tôi sử dụng, nhưng thực tế nó không hiệu quả lắm, vì chúng tôi chỉ có thể giảm thời gian xây dựng gia tăng xuống ~ 4-5m mà KHÔNG CÓ so với phương pháp đầu tiên.