우리는 같은 문제를 겪었고 그것을 고쳤습니다. 두번.
증분 빌드 (동일 빌드 머신) :
전 : ~ 10m 후 : ~ 35s
어떻게?
먼저 경험을 시작합시다. 우리는 방대한 Swift / Obj-C 프로젝트를 가지고 있었고 주요 관심사였습니다. 빌드 시간이 느리고 새로운 기능을 구현하기 위해 새로운 프로젝트를 작성해야했습니다 (문자 그대로). 결코 작동하지 않는 구문 강조를위한 보너스 포인트.
이론
이 문제를 진정으로 해결하려면 빌드 시스템 작동 방식 을 진정으로 이해해야 합니다. 예를 들어이 코드 스 니펫을 사용해 보겠습니다.
import FacebookSDK
import RxSwift
import PinLayout
파일에서이 모든 가져 오기를 사용한다고 상상해보십시오. 또한이 파일은 다른 라이브러리에 의존하는 다른 파일에 의존하며 다른 라이브러리에 의존합니다.
따라서 파일을 컴파일하려면 Xcode는 언급 한 모든 라이브러리 와 라이브러리가 의존하는 모든 파일 을 컴파일해야 하므로 "코어"파일 중 하나를 변경하면 Xcode는 문자 그대로 전체 프로젝트를 다시 작성해야합니다.
Xcode 빌드는 멀티 스레드 이지만 많은 단일 스레드 트리 로 구성됩니다 .
따라서 모든 증분 빌드의 첫 번째 단계에서 Xcode는 다시 컴파일 할 파일을 결정하고 AST 트리를 빌드합니다 . 다른 파일에서 " 신뢰할 수있는 " 것으로 작동하는 파일을 변경하면 " 종속 "으로 작동하는 다른 모든 파일을 다시 컴파일해야합니다.
따라서 첫 번째 조언은 커플 링 을 낮추는 것 입니다. 프로젝트 부분은 서로 독립적이어야합니다.
Obj-C / 스위프트 브리지
Obj-C / Swift 브리지를 사용하는 경우 Xcode는 평소보다 더 많은 단계를 거쳐야합니다.
완벽한 세상:
- Obj-C 코드 작성
- 스위프트 코드 빌드
Obj-C / 스위프트 브리지 :
- [반복 가능한 단계] Obj-C 코드를 컴파일하는 데 필요한 스위프트 코드 작성
- [반복 가능한 단계] Swift 코드를 컴파일하는 데 필요한 Obj-C 코드 빌드
- 의존 할 수없는 Swift & Obj-C 코드 만 남을 때까지 1 & 2를 반복하십시오.
- Obj-C 코드 작성
- 스위프트 코드 빌드
따라서 1 단계 또는 2 단계에서 무언가를 변경하면 기본적으로 문제가있는 것입니다. 가장 좋은 솔루션은 Obj-C / Swift Bridge를 최소화하고 프로젝트에서 제거하는 것입니다.
Obj-C / Swift Bridge가 없다면 훌륭합니다. 다음 단계로 넘어가십시오.
스위프트 패키지 관리자
SwiftPM으로 이동할 시간입니다 (또는 적어도 Cocoapod를 더 잘 구성하십시오).
기본 Cocoapods 구성을 가진 대부분의 프레임 워크는 필요하지 않은 많은 것들과 함께 드래그됩니다.
이를 테스트하려면 PinLayout과 같은 하나의 종속성으로 빈 프로젝트를 만들고 Cocoapods (기본 구성) 및 SwiftPM으로이 코드를 작성하십시오.
import PinLayout
final class TestViewController: UIViewController {
}
스포일러 : Cocoapods는 PinLayout의 모든 수입 (UIKit 포함)을 가져오고 SwiftPM은 프레임 워크를 원자 적으로 가져 오기 때문에 SwiftPM은 가져 오지 않기 때문에이 코드를 컴파일합니다.
더러운 해킹
Xcode 빌드가 다중 스레드임을 기억하십니까?
프로젝트를 여러 개의 독립적 인 조각으로 분할하여 모든 프로젝트를 독립적 인 프레임 워크로 가져올 수 있다면이를 남용 할 수 있습니다. 커플 링을 낮추고 실제로 우리가 사용한 첫 번째 솔루션 이었지만, 실제로는 그다지 효과적이지 않았습니다. 첫 번째 방법과 비교하여 증분 빌드 시간을 ~ 4-5m로 줄일 수 있었기 때문입니다.