เรามีปัญหาเดียวกันและเราแก้ไข สองครั้ง
บิลด์ที่เพิ่มขึ้น (เครื่องบิลด์เดียวกัน):
ก่อน: ~ 10m หลังจาก: ~ 35s
อย่างไร
เริ่มจากประสบการณ์ของเราก่อน เรามีโครงการ Swift / Obj-C ขนาดใหญ่และนั่นเป็นประเด็นหลัก: เวลาในการสร้างช้าและคุณต้องสร้างโครงการใหม่เพื่อใช้คุณสมบัติใหม่ (ตามตัวอักษร) คะแนนโบนัสสำหรับการเน้นไวยากรณ์ที่ไม่ทำงาน
ทฤษฎี
ในการแก้ไขปัญหานี้อย่างแท้จริงคุณต้องเข้าใจอย่างแท้จริงว่าระบบการสร้างทำงานอย่างไร ตัวอย่างเช่นลองโค้ดตัวอย่างนี้:
import FacebookSDK
import RxSwift
import PinLayout
และจินตนาการว่าคุณใช้การนำเข้าทั้งหมดในไฟล์ของคุณ และไฟล์นี้ยังขึ้นอยู่กับไฟล์อื่นซึ่งขึ้นอยู่กับไลบรารีอื่นซึ่งจะใช้ไลบรารีอื่นเป็นต้น
ดังนั้นในการคอมไพล์ไฟล์ Xcode ของคุณจะต้องรวบรวมทุกไลบรารี่ที่คุณพูดถึงและทุก ๆ ไฟล์มันขึ้นอยู่กับดังนั้นถ้าคุณเปลี่ยนหนึ่งในไฟล์ "core" Xcode จะต้องสร้างโครงการทั้งหมดขึ้นมาใหม่
Xcode สร้างเป็นแบบมัลติเธรดแต่มันประกอบด้วยเธรดเดียวหลายต้นไม้
ดังนั้นในขั้นตอนแรกของการสร้างที่เพิ่มขึ้นทุก Xcode คือการตัดสินใจที่มีไฟล์ที่จะเป็นอีกครั้งที่รวบรวมและสร้างต้นไม้ AST หากคุณเปลี่ยนไฟล์ที่ทำหน้าที่ " พึ่งพาได้ " กับไฟล์อื่นดังนั้นไฟล์อื่น ๆ ที่ทำหน้าที่เป็น " พึ่งพา " จะต้องทำการคอมไพล์ใหม่
ดังนั้นคำแนะนำแรกคือการลดการแต่งงานกัน ส่วนโครงการของคุณจะต้องเป็นอิสระจากกัน
Obj-C / Swift bridge
ปัญหากับต้นไม้เหล่านั้นหากคุณใช้สะพาน Obj-C / Swift Xcode จะต้องผ่านเฟสมากกว่าปกติ:
โลกที่สมบูรณ์แบบ:
- สร้างรหัส Obj-C
- สร้างรหัสสวิฟท์
สะพาน Obj-C / Swift:
- [ขั้นตอนการทำซ้ำ] สร้างรหัส Swift ซึ่งจำเป็นในการรวบรวมรหัส Obj-C
- [ขั้นตอนการทำซ้ำ] สร้างรหัส Obj-C ซึ่งจำเป็นในการรวบรวมรหัส Swift
- ทำซ้ำ 1 & 2 จนกว่าคุณจะเหลือรหัส Swift & Obj-C ที่ไม่น่าเชื่อถือเท่านั้น
- สร้างรหัส Obj-C
- สร้างรหัสสวิฟท์
ดังนั้นหากคุณเปลี่ยนบางอย่างจากขั้นตอนที่ 1 หรือ 2 คุณจะมีปัญหา ทางออกที่ดีที่สุดคือลด Obj-C / Swift Bridge ให้เล็กที่สุด (และนำออกจากโครงการของคุณ)
หากคุณไม่มีสะพาน Obj-C / Swift มันยอดเยี่ยมมากและคุณควรไปที่ขั้นตอนต่อไป:
ผู้จัดการแพ็คเกจ Swift
เวลาที่จะย้ายไปที่ SwiftPM (หรืออย่างน้อยก็กำหนดค่า Cocoapod ของคุณให้ดีขึ้น)
สิ่งนี้คือกรอบงานส่วนใหญ่ที่มีการกำหนดค่าเริ่มต้นของการลาก Cocoapods พร้อมกับสิ่งต่างๆมากมายที่คุณไม่ต้องการ
ในการทดสอบนี้ให้สร้างโปรเจ็กต์ว่างเปล่าที่มีการพึ่งพาเพียงหนึ่งเดียวเช่น PinLayout และลองเขียนโค้ดนี้ด้วย Cocoapods (การกำหนดค่าเริ่มต้น) และ SwiftPM
import PinLayout
final class TestViewController: UIViewController {
}
ผู้สปอยเลอร์: Cocoapods จะรวบรวมรหัสนี้เนื่องจาก Cocoapods จะนำเข้าทุกๆ PinLayout (รวมถึง UIKit) และ SwiftPM จะไม่นำเข้าเพราะ SwiftPM นำเข้ากรอบอะตอม
แฮ็คสกปรก
คุณจำ Xcode build ได้หลายเธรดหรือไม่
คุณสามารถใช้มันในทางที่ผิดถ้าคุณสามารถแบ่งโครงการของคุณเป็นชิ้นอิสระจำนวนมากและนำเข้าพวกเขาทั้งหมดเป็นกรอบงานอิสระกับโครงการของคุณ มันลดการมีเพศสัมพันธ์และนั่นเป็นวิธีแก้ปัญหาแรกที่เราใช้ แต่ในความเป็นจริงมันไม่ได้มีประสิทธิภาพมากเพราะเราสามารถลดเวลาการสร้างที่เพิ่มขึ้นเป็น ~ 4-5m ซึ่งไม่มีอะไรเทียบกับวิธีแรก