Jak poradzić sobie z dużym projektem Swift?

Po aplikacji na iPhone ' a, którą piszę w Swifcie, staje się dość duża (>150 .pliki swift + różne libs Objective-C), Xcode start zachowuje się dość źle:

  • Co druga kompilacja dostaję różne błędy, np.:

    Command failed due to signal: Segmentation fault: 11

  • [[5]}kompilacja zajmuje ogromną ilość czasu (>2 min na Macbook Pro Retina)
  • i tak dalej.
Zastanawiam się tylko, czy każdy ma takie same problemy i może ktoś znalazł sposób na zmniejszenie tego koszmaru?

What I have jak na razie - podzieliłem projekt na kilka dynamicznych frameworków, które linkuję z głównego projektu, pomaga to skrócić czas kompilacji, ale wprowadza kilka nowych problemów.

Używam również iRamDisk, aby zachować folder DerivedData w pamięci RAM i okresowo usuwać z niego wszystkie pliki, czasami pomaga to w awariach SourceKit.

Author: Tomasz Bąk, 2015-01-19

5 answers

Swift toolchain jest nadal nieco obrzydliwy, musisz użyć tymczasowych obejść, dopóki Apple go nie naprawi (zobacz aktualizacje poniżej)

Oto lista przedmiotów, które możesz zrobić, aby nie zwariować.

Powolność spowodowana niedojrzałym kompilatorem Swift

  • Zmień swój przepływ pracy programistycznej za pomocą Injection for Xcode. Po zainstalowaniu wtyczki będziesz mógł wprowadzić zmiany kodu w swoim simulator \ device Bez rekompilacja. Nie musisz kodować na twardo\modyfikować niczego w swoim projekcie. Zaczęliśmy go używać niedawno w pracy i wywarło to ogromny wpływ na naszą stronę, nawet jeśli nie dotyczy to wszystkich przypadków użycia(na przykład nie można tworzyć nowych funkcji, można tylko modyfikować istniejące).

  • Niektóre konkretne konstrukcje kodu, które kompilator nie lubi i zajmuje zbyt dużo czasu na kompilację. Najczęstszym problemem jest sprawdzanie typu, które spowalnia czas kompilacji wykładniczo w oparciu o ile kontroli typu musi wykonać (więcej tutaj dla praktycznych przykładów i tutaj dla szczegółowego wyjaśnienia). Aby zidentyfikować, czy cierpisz na ten problem, możesz śledzić ten post na blogu , zbierzesz informacje o funkcjach, które tworzą powolność, używając dodatkowych flag kompilatora. Alternatywnie możesz użyć tej wtyczki Xcode , aby zidentyfikować źródło powolności kompilacji.

  • Użyj dynamicznych ramek mądrze, tam gdzie ma to sens. Rekompilacja frameworka będzie wykonywana tylko wtedy, gdy zmodyfikujesz jeden z jego plików Swift(dynamiczne frameworki są dostępne tylko dla iOS > = 7).

  • Skondensuj kod w tych samych plikach. Zmniejszenie liczby plików Swift rozsądnie przyspiesza proces kompilacji. Można go łatwo osiągnąć, umożliwiając "optymalizację całego modułu", dodając zdefiniowaną przez użytkownika flagę niestandardową SWIFT_WHOLE_MODULE_OPTIMIZATION {[36] } i ustawić ją na yes i jednocześnie ustawić optymalizację level to none (aby wyłączyć optymalizacje, które spowolnią działanie) nieaktualne możesz rozważyć użycie tego gist , jest to skrypt kompilacji, który zwija cały kod w " merge.plik swift. Musisz stworzyć dla niego nowy cel, ale warto spróbuj.

  • Podwójne sprawdzenie rzeczy wymienionych tutaj (jest kilka innych powodów, ponieważ kompilacja jest powolna)

  • Nieaktualne Wypróbuj podejście opisane w ten post na blogu , polega na stworzeniu skryptu kompilacji, który generuje plik make. Wymaga ręcznej interwencji na skrypcie build (zawiera listę plików swift).

  • Nieaktualne Try this hacked up incremental Compilation technique

Aktualizacja: przyrostowe Kompilacje wprowadzone na Swift 1.2 (Xcode 6.3)

Apple w końcu wprowadził przyrostowe Kompilacje z Swift 1.2 (dostarczane z Xcode 6.3). Nie jest jeszcze doskonały, ale to ogromna poprawa.

Od teraz klasa jest rekompilowana tylko wtedy, gdy została zmieniona (lub gdy jedna z klas, od której zależy, została zmieniona). Jednak kompilator nadal nie może zrozumieć, czy zmiany w klasie są związane z jej interfejsem, czy nie. Tak więc każda zmiana na klasę powoduje rekompilację tej klasy i wszystkich jej zależności.

Aktualizacja: Rekompiluj zależne klasy tylko wtedy, gdy zmiany interfejsu publicznego wprowadzone na Swift 2.1 (Xcode 7.1)

Począwszy od Swift 2.1 (Xcode 7.1), zależne klasy są rekompilowane tylko wtedy, gdy zmienisz publiczny interfejs klasy, a nie przy każdej zmianie. Ma to ogromne znaczenie zwłaszcza w przypadku dużych projektów.

Konfiguracja projektu (mis) (niezwiązana z Swift)

  • upewnij się, że opcja "Build Active Architecture Only" służy do debugowania.
  • upewnij się, że nie dodałeś skryptów kompilacyjnych pre\post, które zajmują zbyt dużo czasu.
 58
Author: Daniele,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-08 15:28:31

Apple ma kilka porad na przyspieszenie kompilacji Xcode Uwaga techniczna 2190 . Czy myślałeś o stworzeniu i prekompilacji własnego frameworka do outsourcingu niezmienionych modułów Swift lub jakiegoś / całego kodu Objective-C?

Usuń wszystkie wnioski typu w języku Swift.

Ten temat ma kilka fajnych pomysłów i ten blog post zaproponuj

  1. przestań generować Pakiety dSYM i
  2. unikaj kompilacji z -O4 jeśli używasz Clang.

Chociaż wiele z tych ulepszeń jest związanych z Objective-C, jestem całkiem pewien, że niektóre z nich są nadal istotne dla Swift.

 2
Author: Michael Dorner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 00:08:20

(re)kompilacji jest znany problem, który jestem pewien, że zostanie rozwiązany wkrótce. Niektóre zalecenia:

  • Użyj Objective C tam, gdzie to możliwe - kompiluje się szybko, nawet jeśli jest częścią projektu Swift
  • Podziel kod na frameworki
  • Określ typy zamiast pozostawić je kompilatorowi, aby wywnioskował je

Ponownie, jest duża szansa, że wkrótce zostanie to naprawione, więc może lepiej nie inwestować dużych inwestycji w przepisywanie lub reorganizację kodu w tym punkt w czasie.

 2
Author: MirekE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-23 00:11:16

Możesz spróbować:

  • Aktualizacja ilości pamięci RAM w komputerze
  • Jeśli masz wiele .pliki swift, które działają na tym samym kontrolerze widoku, spróbuj skondensować je w jeden .plik swift na kontroler widoku
  • Poprawiono ustawienia w sekcji źródła kompilacji, aby sprawdzić, czy masz jakieś duplikaty lub czy są jakieś skrypty lub ustawienia, które możesz dodać, aby skompilować je szybciej...

Możesz również rzucić okiem na to odpowiedzi posta dla kilku wskazówek, jak co możesz zrobić, aby spowolnić czas kompilacji

 1
Author: DeveloperACE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:14

Odkryłem, że jedną z głównych przyczyn błędów segmentacji i powolnej kompilacji jest twarde kodowanie dużych tablic i słowników, zwłaszcza gdy deklaruje je jako stałe globalne i próbuje uzyskać dostęp do wartości z nich z innego źródła .plik swift. Kiedy przechowuję wszystkie dane w plistach, te problemy znikają.

 1
Author: bzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-29 15:54:13