Xcode 8 rekompiluje cały kod za każdym razem


132

Po każdej zmianie w kodzie (chociaż plik nie jest w formacie .pch), cały projekt jest rekompilowany za każdym razem.


32
Dlaczego jest to dyskutowane ?! To jest uzasadniony problem. Kompilacja za każdym razem zajmuje 4 minuty, zmniejszając produktywność całego zespołu.
Josh

1
Też mam ten problem.
AJ9,

3
Czy modyfikujesz xib / storyboards za pomocą elementów IBDesignable?
Larme

1
Powiązany wątek na forum Apple: forums.developer.apple.com/thread/62737 . Nadal nie ma obejścia.
ldiqual

1
Upewnij się, że otworzyłeś raport o błędzie, zgodnie z sugestią na forum Apple.
Leo Natan

Odpowiedzi:


34

Aktualizacja 2017/1/2

Ten problem nie został rozwiązany w Xcode 8.2.1 (dla mojego projektu)

Jak przetrwać?

Code IDE: Xcode/Atom
Build: xcrun
Debug: Xcode (Control + Command + R)

Aktualizacja 2016/12/17

Ten problem nie został rozwiązany w Xcode 8.2.

Aktualizacja 2016/12/12

Atom do kodu i wiersz poleceń do kompilacji i debugowania to teraz mój wybór. Mam nadzieję, że Apple wkrótce naprawi ten uzasadniony błąd.

Aktualizacja 2016/12/04

Wydaje się, że ten problem został rozwiązany w Xcode 8.2 (beta 2) .

Ale dla mnie nie można tego rozwiązać, napotykam ten problem nawet wtedy, gdy używam Xcode 8.2. Możesz spróbować (pobierz Xcode8.2 beta2 tutaj )

Buduj system • Xcode nie odbuduje całego celu, gdy wystąpią tylko niewielkie zmiany. (28892475)


Stara odpowiedź: to obejście:

wprowadź opis obrazu tutaj Karta „Build Setting” -> „C Language Dialect” -> Zmień to na „Compiler Default”.

W celach informacyjnych :

„Dialekt języka C” został ustawiony na „GNU99” zamiast „Domyślne ustawienie kompilatora”. Wcześniej standardem był GNU99, ale teraz nim nie jest. W pewnym momencie Xcode nie przeprowadził poprawnej migracji ustawień projektu biblioteki, więc został ustawiony na GNU99. Kiedy zmieniłem go na GNU99, za każdym razem przestałem rekompilować cały mój kod!


1
Na razie w porządku!!! Daj mi godzinę, a nagroda będzie twoja, jeśli tak będzie dalej.
Adam Waite

7
Ach, wróciliśmy do ponownej kompilacji wszystkiego
Adam Waite

1
Mam takie samo zachowanie. Jeśli wyczyszczę dane pochodne (lub zmienię dialekt języka C), będzie działać przez około 10 kompilacji. Następnie wraca do odbudowy wszystkiego.
bluebamboo

1
Xcode 8.2 (beta 2) działa przez 10 kompilacji, a następnie odbudowuje wszystko od zera, ale wciąż lepiej niż poprzednia.
Markus,

3
Niestety problem występuje nadal w Xcode 8.3 beta 2 (przynajmniej dla nas). W naszym projekcie nie można zmierzyć żadnej zauważalnej poprawy.
Kasper Munck

21

Przejdź do Product -> Scheme -> Edit Scheme. Wybierz opcję Kompiluj w lewej kolumnie i odznacz „ Znajdź niejawne zależności

Ale ta flaga powinna pozostać zaznaczona, gdy tworzysz projekt po raz pierwszy.


@Josh, czy korzystasz z wielu projektów w swoim projekcie (np. Podprojekt lub uwzględniony). Czy patrząc na wynik kompilacji, jesteś pewien, że naprawdę odbudowuje wszystko?
Mobile Ben

3
To podstawowy obszar roboczy z cocoapods i głównym projektem. CocoaPods pozostaje zbudowany, ale główny projekt odbudowuje każdy plik; oglądanie wyników kompilacji i zdecydowanie odbudowywanie wszystkich ponad 100 plików.
Josh

1
Aktualizacja: wygląda na to, że to rozwiązanie działa dla kilku kompilacji po wykonaniu tej czynności, jednak tak samo działa czyszczenie całego projektu i przebudowa. Jednak po 2–8 przebudowie zaczyna ponownie wszystko kompilować. Jakieś pomysły? Więcej niż frustrujące.
Josh

To nie działa, przynajmniej nie w przypadku obszaru roboczego CocoaPods. Wszystko buduje się za każdym razem. Super irytujące, zwłaszcza że Apple miało lata na naprawienie tego problemu.
Womble

7

Naprawiono dla mnie właśnie zamknięcie storyboardu, otworzyłem plik źródłowy za pomocą edytora wspomaganego, a także plik storyboardu (zamknięcie storyboardu - ponieważ nie wprowadzałem w nim żadnych zmian), usunąłem wszystkie niepotrzebne kompilacje


1
Ha to może być takie proste :)
manmal

5

AKTUALIZACJA

Największym ulepszeniem, jakie udało mi się wprowadzić, była modularyzacja mojego projektu. Konkretnie modularyzacja warstwy ORM, która jest używana w prawie każdej innej klasie. Przenosząc ten kod do osobnego celu w moim projekcie i importując go jako moduł, mogłem znacznie skrócić czas kompilacji. Xcode już nie decyduje się na ponowną kompilację niepotrzebnych plików, gdy wykonuję kompilację.

Teraz używam metody kompilacji Single File do szybkich przyrostowych kompilacji debugowania.

W tym linku jest kilka innych dobrych sugestii, w tym refaktoryzacja kodu, https://medium.com/rocket-fuel/optimizing-build-times-in-swift-4-dc493b1cc5f5

STARY

Wciąż był to dla mnie ciągły problem z Xcode 9. Podobnie jak wielu z was, pracuję nad dużym, szybkim projektem 4 / cocoapods z wieloma plikami źródłowymi i ponowna kompilacja każdego pliku za każdym razem jest irytująca.

Jak dotąd najlepsze wyniki uzyskuję przy następujących ustawieniach. Proponuję spróbować i zobaczyć, jak to działa.

  • Schemat -> Kompilacja -> „Znajdź niejawne zależności” = TRUE
  • Ustawienia kompilacji -> Optymalizacja czasu łącza = przyrostowe
  • Ustawienia kompilacji -> Poziom optymalizacji (debugowanie) = Brak [-OO]
  • Ustawienia kompilacji -> Poziom optymalizacji (wydanie) = Najszybszy, najmniejszy [-Os]
  • Ustawienia kompilacji -> Zwiększ udostępnianie prekompilowanych nagłówków = TAK
  • Ustawienia kompilacji -> Włącz destylację przyrostową = TAK

Dodano niestandardowe ustawienia kompilacji zdefiniowane przez użytkownika,

  • Ustawienia kompilacji -> HEADERMAP_USERS_VFS = TAK

Uwaga: nie mam niestandardowego ustawienia zdefiniowanego przez użytkownika dla optymalizacji całego modułu.


3

Zmieniłem kilka rzeczy w moim kodzie dotyczącym nagłówka prefiksu, które najwyraźniej rozwiązały ten problem. Nie wiem, który z nich naprawdę zadziałał, ale podzielę się nimi wszystkimi w nadziei, że pomoże to komuś innemu. Jeśli nie masz zestawu nagłówków prefiksów, myślę, że to nie jest problem (lub problem jest wieloaspektowy).

  1. Usuń wszelkie importy z nagłówka prefiksu, które są plikami z katalogu produktów zbudowanych, aby można było zmienić ustawienie kompilacji dla tego („Prekompilowany nagłówek używa plików z katalogu kompilacji”) na „Nie”. Upewnij się, że nie jest importowany pośrednio również poprzez inny import.
  2. Usuń wszelkie importy z nagłówka prefiksu, które używają modułów Clang (bibliotek lub struktur, które mają plik module.modulemap w katalogu Headers, aby można było pisać kod podobny do @import MyModule). (Dla mnie to i krok 1 były jednym i tym samym).
  3. Ustaw ustawienie kompilacji udostępniania nagłówka prefiksu na „Tak”. (Myślę, że nie jest to konieczne i nie powinno to mieć żadnego wpływu na mój własny projekt. Mówię to tylko dlatego, że zmieniłem to, ponieważ chciałem spróbować wszystkiego. :))
  4. Wyjdź z Xcode i usuń katalog DerivedData / ModuleCache (skonfigurowany jako ~ / Library / Developer, jeśli dobrze pamiętam).

Jeśli to nadal nie zadziała, możesz spróbować usunąć więcej importu z nagłówka prefiksu. Coś może się potknąć ...


3

Wygląda na to, że aktywnie nad tym pracują zgodnie z https://forums.developer.apple.com/thread/62737, ale obejściem jest dodanie

HEADERMAP_USES_VFS = YES

w ustawieniach kompilacji celu (Projekt -> Cel -> Ustawienia kompilacji -> Zdefiniowane przez użytkownika).

To rozwiązanie działało dziś u mnie za każdym razem, po tym, jak żadne inne rozwiązanie działało konsekwentnie przez ostatni miesiąc.

EDYCJA: Nadal czasami rekompiluję wszystko, chociaż wydaje się, że robi to znacznie rzadziej z tym ustawieniem.


Dodałem również tę wartość, czas kompilacji jest szybszy, ale nie rozwiązało to kompilacji przyrostowej. Zmieniłem Swift Compiler - Code Generation / Debug to Fast, Whole Module Optimization ... to najlepszy wynik do tej pory
Antonio Junior

nie mogę nawet znaleźć zdefiniowanego przez użytkownika)
David Seek

2
@DavidSeek jest na samym dole ustawień kompilacji
Laser Hawk


3

Sprawdzaj cały swój kod na @IBDesignabledyrektywach w moim konkretnym przypadku projekt kompilacji Xcode przez cały czas, ponieważ miałem kilka widoków na mój scenorys, który zawierał te @IBDesignableatrybuty. Drugą rzeczą jest to, że mam również otwartą scenorys w osobnym oknie (nie na karcie), które powoduje, że mój Xcode tworzy kompilacje dla wszystkich symulatorów na zawsze.


Używamy wielu @IBDesignabledyrektyw ... czy jest coś konkretnego, czego powinniśmy szukać?
Stan

Myślę, że można je znaleźć wykluczając pojedynczo i sprawdzając wynik, w moim przypadku były to tylko 2 dyrektywy @IBDesignable w całym projekcie.
UA

2

Madhuri Mane ma co do tego całkowitą rację. Aby dodać trochę więcej przejrzystości, warto zwrócić uwagę na kilka ważnych punktów:

Ma to zastosowanie TYLKO w przypadku niejawnych zależności od bibliotek / struktur, na których opiera się Twój cel.

Jeśli opcja „Znajdź niejawne zależności” jest wyłączona:

Wynik: biblioteka nie zostanie zbudowana przed zbudowaniem celu aplikacji. Nie można zbudować celu aplikacji.

Poprawka: Aby upewnić się, że drugi scenariusz się nie wydarzy, musisz dodać niezbędne cele do listy celów i odpowiednio je uporządkować.

Źródło i dalsze czytanie na ten temat: https://pewpewthespells.com/blog/managing_xcode.html#scheme-action

Teraz, jeśli cały projekt mieści się w jednym miejscu docelowym, a jego kompilacja zajmuje 4 minuty, niewiele można z tym zrobić, poza rozbiciem go na frameworki, aby skorzystać z powyższego lub dowiedzieć się, gdzie kompilacja się opóźnia. Jeśli używasz czegoś takiego jak PaintCode lub masz duże fragmenty kodu UIKit w szybkim tempie, zmień go na Objective-c, kompiluje się znacznie szybciej


2

Przejdź do ustawień kompilacji celu i ustaw Defines Modulena Yes.

Pracowałem dla mnie przez kilka kompilacji, zbyt wcześnie, by twierdzić, że jest to ostateczne obejście, ale przynajmniej próbujemy.


2

Apple wydało wczoraj nową wersję beta Xcode (14 listopada)

Xcode 8.2 beta 2

Ten problem został oznaczony jako rozwiązany w informacji o wersji.

Zbuduj system

• Xcode nie odbuduje całego celu, gdy wystąpią tylko niewielkie zmiany. (28892475)

To działa dla mnie. Szybkość budowania wróciła jak zwykle. Każdy, kto ma do czynienia z tym problemem, powinien spróbować!

https://developer.apple.com/download/


2

Przejdź do ustawień kompilacji projektu i zmień „Dialekt języka C”.

„Dialekt języka C” jest ustawiany na „GNU99” zamiast „Domyślny kompilator”, gdy aktualizujesz wersję xcode. W pewnym momencie Xcode nie przeprowadził poprawnej migracji ustawień projektu biblioteki, więc został ustawiony na GNU99. To rozwiąże problem


1

Jeśli dokonałeś zmian w pliku Swift, zacznij budować aplikację, przejdź do ostatniej zakładki i kliknij dziennik kompilacji, na etapie „Sprawdź zależności” zatrzymaj kompilację i uruchom ją ponownie. Przy drugim uruchomieniu powinien budować tylko zmodyfikowane pliki. Jeśli zrobiono to poprawnie, stwierdziłem, że działa za każdym razem. Nie ma potrzeby dokonywania żadnych zmian ustawień projektu.

Wygląda na to, że jest to błąd w Xcode.

wprowadź opis obrazu tutaj

Jeśli widzisz, że aplikacja wykonuje pełną kompilację, zatrzymaj kompilację i spróbuj ponownie.

Jeśli nie wprowadziłeś żadnych zmian w kodzie, użyj CMD + CTRL + R, aby uruchomić bez kompilowania aplikacji, która dołącza debuger. Nie utworzy aplikacji, ale może pomóc zaoszczędzić niepotrzebny czas.


To naprawdę działa, ale czasami XCode zawiedzie z kodem 1 i będziesz musiał wykonać czystą kompilację. To koszmar
Antonio Junior

Istnieją inne scenariusze, w których Xcode zawsze wykona pełną kompilację. Odkryłem, że jeśli zmodyfikujesz plik .h zawarty w nagłówku mostkowania, odbuduje on wszystkie pliki Swift. Mogą istnieć inne scenariusze, które nie są związane z błędem Xcode.
Vlad

Istnieją scenariusze, w których jedyną zmianą jest zmiana nazwy funkcji lub nowa właściwość dodana do istniejącej klasy / struktury, co skutkuje całkowitą przebudową.
Antonio Junior

Skorzystaj z tego pytania / odpowiedzi, ten wątek jest duplikatem tego: Miej rozwiązanie, które działa lepiej: stackoverflow.com/questions/39456223/ ...
Vlad

1

Problem z mojej strony rozwiązany przez odznaczenie rozwiązania „Znajdź niejawne zależności”.

ALE pamiętaj, jeśli używasz cocoapods, aby zastosować te ustawienia również do projektu pod, wybierając je z

Produkt -> Schemat -> Pods - „nazwa_projektu”

mają również zastosowanie w:

Produkt -> Schemat -> „yourProjectName”

Pomaga mi, więc mam nadzieję, że ta wskazówka pomoże komuś innemu.

Dzięki


1

Spróbuj: 1. Przejdź do projektu 2. Kliknij opcję Ustawienia kompilacji 3. Sprawdź, czy w przypadku debugowania OptimizationLevel jest ustawiona wartość Brak. 4. Kliknij opcję Dodaj ustawienie zdefiniowane przez użytkownika. 5. Ustaw SWIFT_WHOLE_MODULE_OPTIMIZATION na YES.

wprowadź opis obrazu tutaj


nic do pracy to nadal kompiluje, kiedy piszę jedną literę.
Chandni

-2

aby przyspieszyć kompilację xcode, można skorzystać z IRAMDISK (wirtualny dysk pamięci). Bardzo użyteczne i skuteczne sposoby na skrócenie czasu kompilacji.

Można również użyć do przyspieszenia często używanej aplikacji.

skorzystaj z następującego łącza, aby pobrać i używać: http://iramdisk.findmysoft.com/mac/


Nie przyspieszy to kompilacji, jeśli masz już dysk SSD.
Jano
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.