Xcode 11 biên dịch lại quá nhiều


12

Xcode 11 đang biên dịch lại (gần?) Toàn bộ dự án của tôi, ngay cả khi tôi chỉ thay đổi một biến riêng tư cục bộ hoặc thay đổi giá trị của hằng số trong phạm vi cục bộ, đôi khi ngay cả trong phạm vi chức năng riêng tư cục bộ. Đôi khi tôi có thể nhận được 2 hoặc 3 thay đổi với các bản dựng nhanh như mong đợi, nhưng chẳng mấy chốc, nó quyết định biên dịch lại mọi thứ một lần nữa (mất quá nhiều thời gian).

Bất kỳ ý tưởng những gì có thể xảy ra? Là Xcode không thể xác định những gì đã thay đổi, tại sao nó lại biên dịch lại rất nhiều thứ khác (ngay cả các mô-đun khác).

Mọi lời khuyên đều được đánh giá cao, cảm ơn!


2
Tôi sẽ khuyên: Hãy chắc chắn rằng bạn đang thực hiện các bản dựng gỡ lỗi với tòa nhà gia tăng, không phải tối ưu hóa toàn bộ mô-đun. Thoát và dọn sạch DeruredData. Và cập nhật lên Xcode 11.4, đôi khi nó biên dịch nhanh đến mức tôi thậm chí không thấy điều đó xảy ra.
mờ

1
Chủ đề này có thể trả lời câu hỏi của bạn: stackoverflow.com/questions/25537614/ từ
Endanke

Nó rất phụ thuộc vào dự án, nó cần phân tích nhật ký xây dựng về những gì đang diễn ra. Tôi không quan sát hành vi như vậy với Xcode 11.2+, trong khi có các dự án rất lớn. Bạn có thể cung cấp quyền truy cập vào các nguồn dự án của bạn bằng cách nào đó, nếu không tất cả các lời khuyên là vô nghĩa?
Asperi

Kiểm tra thuộc tính Legacy Build System, nó sẽ được bỏ chọn nếu bạn không sửa đổi các mô hình con
BrunoLoops

Câu trả lời:


8

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.

Cây phụ thuộc

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.

Khớp nố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:

  1. Xây dựng mã Obj-C
  2. Xây dựng mã Swift

Cầu Swift / Obj-C

Cầu Obj-C / Swift:

  1. [BƯỚC REPEATABLE] Xây dựng mã Swift, cần thiết để biên dịch mã Obj-C
  2. [BƯỚC REPEATABLE] Xây dựng mã Obj-C, cần thiết để biên dịch mã Swift
  3. 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
  4. Xây dựng mã Obj-C
  5. Xây dựng mã Swift

Cầu Obj-C / 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.


Nguoi ban doi may man. Chia sẻ kinh nghiệm của bạn về cách bạn hạ thấp khớp nối trong dự án của bạn. Tạm biệt!
x0 z1

3

Không có viên đạn vàng nào ở đây, nhưng có rất nhiều thứ để kiểm tra:

  • Đảm bảo bạn đang thực sự sử dụng cấu hình Gỡ lỗi trong sơ đồ của mìnhTrình soạn thảo sơ đồ Xcode bằng cách sử dụng cấu hình Gỡ lỗi

  • Xem bên dưới để biết cách đảm bảo bạn đang sử dụng các bản dựng tăng dần so với toàn bộ mô-đun theo lời khuyên của matt. Ngoài ra, hãy đảm bảo Mức tối ưu hóa cho các bản dựng Debug là không có. Cài đặt Xcode Build hiển thị Bản dựng tăng dần

  • Nếu bạn đang sử dụng các khung nặng suy luận kiểu như RxSwift, việc thêm các chú thích loại rõ ràng có thể tăng tốc thời gian xây dựng.

  • Nếu dự án rất lớn, bạn có thể xem xét tái cấu trúc các nhóm tệp nguồn hợp lý thành các khung, nhưng điều đó có thể quá quyết liệt đối với thay đổi so với bạn muốn

Nó có thể hữu ích nếu bạn cung cấp một số chi tiết cụ thể hơn về dự án: bạn có liên kết tĩnh bất kỳ thư viện nào không? Nó là một khung hoặc mục tiêu ứng dụng? Làm thế nào lớn và phiên bản nhanh chóng bạn đang sử dụng? Bạn có bất kỳ Giai đoạn xây dựng tùy chỉnh nào như linters hoặc tạo mã đôi khi có thể bị bỏ qua không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.