Xcode 11 คอมไพล์ใหม่มากเกินไป


12

Xcode 11 กำลังคอมไพล์ใหม่ (เกือบ) โครงการทั้งหมดของฉันแม้ว่าฉันเพิ่งเปลี่ยนตัวแปรส่วนตัวในพื้นที่หรือเปลี่ยนค่าคงที่ในขอบเขตท้องถิ่นบางครั้งแม้แต่ในขอบเขตฟังก์ชั่นส่วนตัวในท้องถิ่น บางครั้งฉันอาจได้รับการเปลี่ยนแปลง 2 หรือ 3 ครั้งโดยการสร้างอย่างรวดเร็วตามที่คาดไว้ แต่ไม่นานพอที่จะตัดสินใจคอมไพล์ทุกอย่างอีกครั้ง (ซึ่งใช้เวลานานเกินไป)

ความคิดใด ๆ ที่อาจเกิดขึ้น? Xcode ไม่สามารถระบุสิ่งที่เปลี่ยนแปลงได้ทำไมจึงทำการคอมไพล์อีกหลายอย่าง (แม้แต่โมดูลอื่น ๆ )

คำแนะนำใด ๆ ที่ชื่นชมอย่างมากขอบคุณ!


2
ฉันจะแนะนำ: ตรวจสอบให้แน่ใจว่าคุณกำลังทำการแก้ไขข้อบกพร่องการสร้างด้วยการสร้างที่เพิ่มขึ้นไม่ใช่การเพิ่มประสิทธิภาพโมดูลทั้งหมด ออกและล้างข้อมูล DerivedData และอัปเดตเป็น Xcode 11.4 บางครั้งมันก็คอมไพล์อย่างรวดเร็วฉันไม่ได้เห็นมันเกิดขึ้น
แมตต์

1
กระทู้นี้อาจตอบคำถามของคุณ: stackoverflow.com/questions/25537614/…
Endanke

มันขึ้นอยู่กับโครงการเป็นอย่างมากมันต้องวิเคราะห์บันทึกการสร้างสิ่งที่เกิดขึ้น ฉันไม่สังเกตพฤติกรรมดังกล่าวด้วย Xcode 11.2+ ในขณะที่มีโครงการขนาดใหญ่มาก คุณจะให้การเข้าถึงแหล่งที่มาโครงการของคุณอย่างใดมิฉะนั้นคำแนะนำทั้งหมดจะหมดความรู้สึก?
Asperi

ตรวจสอบคุณสมบัติของ Legacy Build System มันไม่ควรถูกตรวจสอบหากคุณไม่ได้แก้ไข submodules
BrunoLoops

คำตอบ:


8

เรามีปัญหาเดียวกันและเราแก้ไข สองครั้ง

บิลด์ที่เพิ่มขึ้น (เครื่องบิลด์เดียวกัน):

ก่อน: ~ 10m หลังจาก: ~ 35s

อย่างไร

เริ่มจากประสบการณ์ของเราก่อน เรามีโครงการ Swift / Obj-C ขนาดใหญ่และนั่นเป็นประเด็นหลัก: เวลาในการสร้างช้าและคุณต้องสร้างโครงการใหม่เพื่อใช้คุณสมบัติใหม่ (ตามตัวอักษร) คะแนนโบนัสสำหรับการเน้นไวยากรณ์ที่ไม่ทำงาน

ทฤษฎี

ในการแก้ไขปัญหานี้อย่างแท้จริงคุณต้องเข้าใจอย่างแท้จริงว่าระบบการสร้างทำงานอย่างไร ตัวอย่างเช่นลองโค้ดตัวอย่างนี้:

import FacebookSDK
import RxSwift
import PinLayout

และจินตนาการว่าคุณใช้การนำเข้าทั้งหมดในไฟล์ของคุณ และไฟล์นี้ยังขึ้นอยู่กับไฟล์อื่นซึ่งขึ้นอยู่กับไลบรารีอื่นซึ่งจะใช้ไลบรารีอื่นเป็นต้น

ดังนั้นในการคอมไพล์ไฟล์ Xcode ของคุณจะต้องรวบรวมทุกไลบรารี่ที่คุณพูดถึงและทุก ๆ ไฟล์มันขึ้นอยู่กับดังนั้นถ้าคุณเปลี่ยนหนึ่งในไฟล์ "core" Xcode จะต้องสร้างโครงการทั้งหมดขึ้นมาใหม่

ต้นไม้พึ่งพา

Xcode สร้างเป็นแบบมัลติเธรดแต่มันประกอบด้วยเธรดเดียวหลายต้นไม้

ดังนั้นในขั้นตอนแรกของการสร้างที่เพิ่มขึ้นทุก Xcode คือการตัดสินใจที่มีไฟล์ที่จะเป็นอีกครั้งที่รวบรวมและสร้างต้นไม้ AST หากคุณเปลี่ยนไฟล์ที่ทำหน้าที่ " พึ่งพาได้ " กับไฟล์อื่นดังนั้นไฟล์อื่น ๆ ที่ทำหน้าที่เป็น " พึ่งพา " จะต้องทำการคอมไพล์ใหม่

coupling

ดังนั้นคำแนะนำแรกคือการลดการแต่งงานกัน ส่วนโครงการของคุณจะต้องเป็นอิสระจากกัน

Obj-C / Swift bridge

ปัญหากับต้นไม้เหล่านั้นหากคุณใช้สะพาน Obj-C / Swift Xcode จะต้องผ่านเฟสมากกว่าปกติ:

โลกที่สมบูรณ์แบบ:

  1. สร้างรหัส Obj-C
  2. สร้างรหัสสวิฟท์

สะพาน Swift / Obj-C

สะพาน Obj-C / Swift:

  1. [ขั้นตอนการทำซ้ำ] สร้างรหัส Swift ซึ่งจำเป็นในการรวบรวมรหัส Obj-C
  2. [ขั้นตอนการทำซ้ำ] สร้างรหัส Obj-C ซึ่งจำเป็นในการรวบรวมรหัส Swift
  3. ทำซ้ำ 1 & 2 จนกว่าคุณจะเหลือรหัส Swift & Obj-C ที่ไม่น่าเชื่อถือเท่านั้น
  4. สร้างรหัส Obj-C
  5. สร้างรหัสสวิฟท์

Obj-C / Swift bridge

ดังนั้นหากคุณเปลี่ยนบางอย่างจากขั้นตอนที่ 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 ซึ่งไม่มีอะไรเทียบกับวิธีแรก


โชคดีนะเพื่อน แบ่งปันประสบการณ์ของคุณว่าคุณจะลดการมีเพศสัมพันธ์ในโครงการของคุณอย่างไร บาย!
x0 z1

3

ไม่มีกระสุนสีทองที่นี่ แต่มีหลายสิ่งให้ตรวจสอบ:

  • ตรวจสอบให้แน่ใจว่าคุณใช้การกำหนดค่าDebugในแบบแผนของคุณจริงXcode Scheme Editor โดยใช้การกำหนดค่า Debug

  • ดูด้านล่างสำหรับวิธีการทำให้แน่ใจว่าคุณกำลังใช้งานบิลด์ที่เพิ่มขึ้นเมื่อเทียบกับโมดูลทั้งหมดต่อคำแนะนำของแมตต์ ตรวจสอบให้แน่ใจด้วยว่าระดับการปรับให้เหมาะสมของคุณสำหรับการสร้างการดีบักนั้นไม่มีเลย การตั้งค่า Xcode Build แสดง Builds ที่เพิ่มขึ้น

  • หากคุณกำลังใช้เฟรมเวิร์กขนาดใหญ่อนุมานประเภทเช่น RxSwift การเพิ่มคำอธิบายประกอบประเภทที่ชัดเจนสามารถเพิ่มเวลาสร้างได้

  • หากโครงการมีขนาดใหญ่มากคุณสามารถพิจารณาการจัดกลุ่มโลจิคัลของไฟล์ต้นฉบับใหม่ให้เป็นเฟรมเวิร์ก แต่นั่นอาจรุนแรงเกินกว่าที่จะเปลี่ยนแปลง

มันอาจช่วยได้ถ้าคุณให้รายละเอียดเพิ่มเติมเกี่ยวกับโครงการ: คุณเชื่อมโยงไลบรารีแบบคงที่หรือไม่ มันเป็นกรอบหรือเป้าหมายของแอพ คุณใช้เวอร์ชั่นที่รวดเร็วและใหญ่แค่ไหน? คุณมี Build Phases แบบกำหนดเองเช่น linters หรือการสร้างรหัสที่สามารถข้ามได้บ้างหรือไม่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.