Xcode 11 बहुत अधिक recompiles


12

Xcode 11 फिर से शुरू हो रहा है (लगभग?) मेरी पूरी परियोजना, भले ही मैं सिर्फ एक स्थानीय निजी चर को बदल दूं, या स्थानीय दायरे में एक निरंतरता के मूल्य को बदल दूं, कभी-कभी स्थानीय निजी कार्यक्षेत्र में भी। मुझे कुछ समय में उम्मीद के मुताबिक त्वरित बिल्ड के साथ 2 या 3 बदलाव मिल सकते हैं, लेकिन जल्द ही यह सब कुछ फिर से शुरू करने का फैसला करता है (जिसमें बहुत लंबा समय लगता है)।

किसी भी विचार क्या हो सकता है? क्या एक्सकोड यह निर्धारित करने में सक्षम नहीं है कि क्या बदल गया है, यह इतना अधिक सामान (यहां तक ​​कि अन्य मॉड्यूल) को फिर से क्यों करता है।

किसी भी सलाह बहुत सराहना की है, धन्यवाद!


2
मैं सलाह दूंगा: सुनिश्चित करें कि आप वृद्धिशील बिल्डिंग के साथ डिबग बिल्ड कर रहे हैं, न कि पूरे मॉड्यूल ऑप्टिमाइज़ेशन के। बाहर निकलें और DerivedData को साफ करें। और Xcode 11.4 पर अपडेट करें, यह कभी-कभी इतनी तेजी से संकलित करता है कि मुझे ऐसा होता दिखाई भी नहीं देता।
मैट

1
यह थ्रेड आपके प्रश्न का उत्तर दे सकता है: stackoverflow.com/questions/25537614/…
6

यह बहुत ही प्रोजेक्ट-डिपेंडेंट है, इसमें जो भी चल रहा है, उस पर बिल्ड लॉग का विश्लेषण करने की जरूरत है। मैं Xcode 11.2+ के साथ इस तरह का व्यवहार नहीं करता हूं, जबकि बहुत बड़ी परियोजनाएं हैं। क्या आप किसी तरह अपने प्रोजेक्ट स्रोतों तक पहुंच प्रदान करेंगे, अन्यथा सभी सलाह संवेदनहीन हैं?
एस्परि

लीगेसी बिल्ड सिस्टम प्रॉपर्टी की जाँच करें, अगर आप
सबमॉड्यूल

जवाबों:


8

हमें भी यही समस्या थी और हमने इसे ठीक किया। दो बार।

वृद्धिशील निर्माण (एक ही मशीन का निर्माण):

इससे पहले: ~ 10 मीटर के बाद: ~ 35 एस

कैसे?

पहले अपने अनुभव से शुरू करते हैं। हमारे पास एक बड़ी स्विफ्ट / ओज-सी परियोजना थी और यह मुख्य चिंता का विषय था: निर्माण समय धीमा था और आपको एक नई सुविधा (शाब्दिक) को लागू करने के लिए एक नई परियोजना तैयार करनी थी। कभी काम न करने वाले सिंटैक्स हाइलाइटिंग के लिए बोनस अंक।

सिद्धांत

इसे ठीक करने के लिए आपको वास्तव में समझना होगा कि सिस्टम कैसे काम करता है। उदाहरण के लिए, आइए इस कोड स्निपेट को आज़माएँ:

import FacebookSDK
import RxSwift
import PinLayout

और कल्पना करें कि आप अपनी फ़ाइल में इन सभी आयातों का उपयोग करते हैं। और यह फ़ाइल किसी अन्य फ़ाइल पर भी निर्भर करती है, जो किसी अन्य लाइब्रेरी पर निर्भर करती है, जो बदले में किसी अन्य लाइब्रेरी आदि का उपयोग करती है।

तो अपनी फाइल को संकलित करने के लिए Xcode को आपके द्वारा बताई गई प्रत्येक लाइब्रेरी को संकलित करना होगा और हर फाइल पर निर्भर करता है, इसलिए यदि आप "कोर" फ़ाइलों में से एक को बदलते हैं तो Xcode को सचमुच पूरे प्रोजेक्ट का पुनर्निर्माण करना होगा।

निर्भरता का पेड़

Xcode बिल्ड बहु-थ्रेडेड है , लेकिन इसमें कई एकल-थ्रेडेड ट्री होते हैं ।

तो हर वृद्धिशील बिल्ड Xcode के पहले कदम पर तय कर रहा है कि कौन सी फाइलों को फिर से संकलित करना है और एक एएसटी पेड़ का निर्माण करना है । यदि आप ऐसी फ़ाइल बदलते हैं जो अन्य फ़ाइलों पर " भरोसेमंद " के रूप में कार्य कर रही है, तो हर दूसरी फ़ाइल जो " आश्रित " के रूप में कार्य करती है, उसे असंपीड़ित किया जाना है।

युग्मन

इसलिए पहली सलाह कपलिंग को कम करना है । आपके प्रोजेक्ट भागों को एक-दूसरे से स्वतंत्र होना चाहिए।

ओबज-सी / स्विफ्ट पुल

उन पेड़ों के साथ समस्या यदि आप ओबज-सी / स्विफ्ट पुल का उपयोग कर रहे हैं, तो Xcode को सामान्य से अधिक चरणों से गुजरना पड़ता है:

आदर्श दुनिया:

  1. Obj-C कोड बनाता है
  2. स्विफ्ट कोड बनाएँ

स्विफ्ट / ओबज-सी ब्रिज

ओबज-सी / स्विफ्ट पुल:

  1. [दोहराए गए कदम] स्विफ्ट कोड बनाएँ, जिसे ओबज-सी कोड संकलित करने की आवश्यकता है
  2. [दोहराए गए कदम] ओज-सी कोड बनाएँ, जो स्विफ्ट कोड को संकलित करने के लिए आवश्यक है
  3. जब तक आपके पास केवल गैर-भरोसेमंद स्विफ्ट और ओबज-सी कोड नहीं बचा है, तब तक 1 और 2 दोहराएं
  4. ओबज-सी कोड बनाएँ
  5. स्विफ्ट कोड बनाएँ

ओबज-सी / स्विफ्ट पुल

इसलिए यदि आप चरण 1 या 2 से कुछ बदलते हैं, तो आप मूल रूप से परेशानी में हैं। सबसे अच्छा उपाय ओब्ज-सी / स्विफ्ट ब्रिज को कम करना है (और इसे अपनी परियोजना से हटा दें)।

यदि आपके पास ओबज-सी / स्विफ्ट ब्रिज नहीं है, तो यह बहुत बढ़िया है और आप अगले चरण पर जाने के लिए अच्छे हैं:

स्विफ्ट पैकेज मैनेजर

SwiftPM में स्थानांतरित होने का समय (या कम से कम अपने कोकोपोड्स को बेहतर तरीके से कॉन्फ़िगर करने के लिए)।

बात यह है, डिफ़ॉल्ट Cocoapods विन्यास के साथ सबसे चौखटे अपने आप को बहुत सारे सामानों के साथ खींचते हैं जिनकी आपको ज़रूरत नहीं है।

उदाहरण के लिए, PinLayout जैसी केवल एक निर्भरता के साथ एक खाली प्रोजेक्ट बनाने के लिए, इस कोड को Cocoapods (डिफ़ॉल्ट कॉन्फ़िगरेशन) और SwiftPM के साथ लिखने का प्रयास करें।

import PinLayout

final class TestViewController: UIViewController {

}

Spoiler: Cocoapods इस कोड को संकलित करेगा, क्योंकि Cocoapods हर जगह PinLayout (UIKit सहित) और SwiftPM का आयात करेगा क्योंकि SwiftPM परमाणु फ्रेमवर्क को परमाणु रूप से आयात नहीं करता है।

डर्टी हैक

क्या आपको याद है कि Xcode बिल्ड मल्टी थ्रेडेड है?

ठीक है, आप इसका दुरुपयोग कर सकते हैं, यदि आप अपनी परियोजना को कई स्वतंत्र टुकड़ों में विभाजित करने में सक्षम हैं और उन सभी को अपनी परियोजना के लिए स्वतंत्र रूपरेखा के रूप में आयात कर सकते हैं। यह युग्मन को कम करता है और यह वास्तव में पहला समाधान था जिसका हमने उपयोग किया था, लेकिन यह वास्तव में बहुत प्रभावी नहीं था, क्योंकि हम केवल वेतन वृद्धि के समय को घटाकर ~ 4-5 मीटर कर सकते थे जो कि पहली विधि की तुलना में कुछ भी नहीं है।


शुभकामनाएं मेट। अपना अनुभव साझा करें कि आपने अपने प्रोजेक्ट में कपलिंग को कैसे कम किया। अलविदा!
x0 z1

3

यहां कोई सुनहरी गोली नहीं है, लेकिन जांच के लिए बहुत सी चीजें हैं:

  • सुनिश्चित करें कि आप वास्तव में अपनी योजना में डिबग कॉन्फ़िगरेशन का उपयोग कर रहे हैंडीबग कॉन्फ़िगरेशन का उपयोग करके Xcode योजना संपादक

  • यह सुनिश्चित करने के लिए नीचे देखें कि आप मैट की सलाह के अनुसार वृद्धिशील बिल्ड बनाम पूरे मॉड्यूल का उपयोग कर रहे हैं। यह भी सुनिश्चित करें कि डिबग बिल्ड के लिए आपका अनुकूलन स्तर कोई भी नहीं है। Xcode बिल्ड सेटिंग्स इंक्रीमेंटल बिल्ड दिखाती हैं

  • यदि आप RxSwift जैसे टाइप-इनफेरेंस हैवी फ्रेमवर्क का उपयोग कर रहे हैं, तो स्पष्ट प्रकार एनोटेशन को जोड़ने से बिल्ड टाइम की गति बढ़ सकती है।

  • यदि परियोजना बहुत बड़ी है, तो आप स्रोत फ़ाइलों के तार्किक समूहों को रूपरेखा में बदलने पर विचार कर सकते हैं, लेकिन यह आपके द्वारा पसंद किए जाने से एक बदलाव का बहुत कठोर हो सकता है।

यदि आप इस परियोजना के बारे में कुछ और जानकारी प्रदान करते हैं तो यह मदद कर सकता है: क्या आप किसी पुस्तकालय को सांख्यिकीय रूप से जोड़ रहे हैं? क्या यह एक फ्रेमवर्क या ऐप लक्ष्य है? आप कितने बड़े और कौन से स्विफ्ट संस्करण का उपयोग कर रहे हैं? क्या आपके पास कोई कस्टम बिल्ड लिंटर जैसे लिंटर या कोड जनरेशन है जिसे कभी-कभी स्किप किया जा सकता है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.