Xcode 8 recompilant le code complet à chaque fois


131

Avec tout changement de code (bien que le fichier ne soit pas au format .pch), le projet complet se recompile à chaque fois.


31
Pourquoi ce vote est-il défavorable?! C'est une question légitime. Prend 4 minutes à compiler à chaque fois, nuked toute la productivité de l'équipe.
Josh

1
Moi aussi, j'ai ce problème.
AJ9 du

3
Modifiez-vous xib / storyboards avec des éléments IBDesignable?
Larme le

1
Sujet connexe du forum Apple: forums.developer.apple.com/thread/62737 . Pas encore de solution de contournement.
ldiqual le

1
Assurez-vous d'ouvrir un rapport de bogue, comme suggéré dans le forum Apple.
Leo Natan

Réponses:


34

Mise à jour 2017/1/2

Ce problème n'a pas été résolu sur Xcode 8.2.1 (pour mon projet)

Comment survivre?

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

Mise à jour 2017/12/17

Ce problème n'a pas été résolu dans Xcode 8.2.

Mise à jour 12/12/2016

Atom vers le code et la ligne de commande pour construire et déboguer est mon choix maintenant. J'espère qu'Apple corrigera bientôt ce bug légitime.

Mise à jour 04/12/2016

Ce problème semble résolu avec Xcode 8.2 (beta 2) .

Mais pour moi, ce n'est pas résolu, je suis confronté à ce problème même lorsque j'utilise Xcode 8.2. Vous pouvez l'essayer (téléchargez Xcode8.2 beta2 ici )

Système de construction • Xcode ne reconstruira pas une cible entière lorsque seuls de petits changements se sont produits. (28892475)


Ancienne réponse: Il s'agit d'un travail autour de:

entrez la description de l'image ici Onglet "Build Setting" -> "C Language Dialect" -> Changez-le en "Compiler Default".

Pour référence :

Le "Dialecte du langage C" a été réglé sur "GNU99" au lieu de "Compiler Default". Auparavant, le standard était GNU99 mais maintenant ce n'est pas le cas. À un moment donné, Xcode n'a pas migré correctement les paramètres du projet de bibliothèque et a donc été défini sur GNU99. Une fois que je l'ai changé en GNU99, il a arrêté de recompiler tout mon code à chaque fois!


1
Jusqu'ici tout va bien!!! Donnez-moi une heure et la prime est à vous si elle continue.
Adam Waite

7
Argh est de retour pour tout recompiler
Adam Waite

1
J'ai le même comportement. Si j'efface les données dérivées (ou change le dialecte du langage C), cela fonctionnera pendant environ 10 versions. Après cela, il retombe pour tout reconstruire.
bluebamboo

1
Xcode 8.2 (beta 2) fonctionne pour 10 builds puis reconstruit tout à partir de zéro, mais toujours mieux que le précédent.
Markus

3
Malheureusement, le problème persiste dans Xcode 8.3 beta 2 (du moins pour nous). Aucune amélioration notable ne peut être mesurée dans notre projet.
Kasper Munck

20

Allez dans Product -> Scheme -> Edit Scheme. Sélectionnez Construire dans la colonne de gauche et décochez " Rechercher les dépendances implicites "

Mais cet indicateur doit rester coché lorsque vous créez le projet pour la première fois.


@Josh, utilisez-vous plusieurs projets dans votre projet (par exemple sous-projet ou inclus). Et êtes-vous sûr, en regardant la sortie de votre build, qu'il reconstruit vraiment tout?
Mobile Ben

3
C'est un espace de travail de base avec des cocoapodes et le projet principal. CocoaPods reste construit, mais le projet principal reconstruit chaque fichier; regarder la sortie de la construction et sa reconstruction de plus de 100 fichiers.
Josh

1
Mise à jour: il semble que cette solution fonctionne pour quelques versions après cela, mais il en va de même pour le nettoyage de l'ensemble du projet et la reconstruction. Cependant, à la 2-8ème reconstruction, il recommence à tout recompiler. Des idées? Au-delà de la frustration.
Josh

Cela ne fonctionne pas, du moins pas avec un espace de travail CocoaPods. Tout se construit, à chaque fois. Super ennuyeux, d'autant plus qu'Apple a eu des années pour résoudre ce problème.
Womble

7

Le correctif pour moi consistait simplement à fermer le storyboard, j'avais ouvert le fichier source avec l'éditeur assisté et le fichier de storyboard ouvert également (en fermant le storyboard --- puisque je n'y apportais aucune modification) supprimait toute la compilation inutile


1
Ha ça peut être si facile :)
manmal

5

ACTUALISÉ

La plus grande amélioration que j'ai pu apporter a été la modularisation de mon projet. Modulariser spécifiquement la couche ORM qui est utilisée dans presque toutes les autres classes. En déplaçant ce code dans une cible distincte dans mon projet et en l'important en tant que module, j'ai pu considérablement améliorer les temps de compilation. Xcode ne décide plus de recompiler les fichiers inutiles lorsque je fais une compilation.

J'utilise maintenant la méthode de compilation Single File pour les versions de débogage incrémentielles rapides.

Il y a d'autres bonnes suggestions dans ce lien, y compris la refactorisation du code, https://medium.com/rocket-fuel/optimizing-build-times-in-swift-4-dc493b1cc5f5

VIEUX

Cela a toujours été un problème constant pour moi avec Xcode 9. Comme beaucoup d'entre vous, je travaille sur un grand swift 4 / cocoapods avec de nombreux fichiers sources et chaque fichier à chaque fois est exaspérant.

Jusqu'à présent, j'obtiens les meilleurs résultats avec les paramètres suivants. Je vous suggère de l'essayer et de voir comment cela fonctionne pour vous.

  • Schéma -> Construire -> "Rechercher les dépendances implicites" = TRUE
  • Paramètres de construction -> Optimisation au moment du lien = incrémentielle
  • Paramètres de construction -> Niveau d'optimisation (débogage) = Aucun [-OO]
  • Paramètres de construction -> Niveau d'optimisation (version) = le plus rapide, le plus petit [-Os]
  • Paramètres de construction -> Augmenter le partage des en-têtes précompilés = OUI
  • Paramètres de construction -> Activer la distillation incrémentielle = OUI

Ajout de paramètres de construction personnalisés définis par l'utilisateur,

  • Paramètres de construction -> HEADERMAP_USERS_VFS = OUI

Remarque: je n'ai pas le paramètre personnalisé défini par l'utilisateur pour l'optimisation de l'ensemble du module.


3

J'ai changé quelques choses avec mon code concernant l'en-tête de préfixe qui semblent avoir résolu ce problème. Je ne sais pas lequel a vraiment fait l'affaire, mais je vais tous les partager dans l'espoir que cela aide quelqu'un d'autre. Si vous n'avez pas de jeu d'en-tête de préfixe, alors je suppose que ce n'est pas le problème (ou le problème est multiforme).

  1. Supprimez toutes les importations de l'en-tête de préfixe qui sont des fichiers du répertoire des produits générés afin de pouvoir modifier le paramètre de génération pour cela («L'en-tête précompilé utilise les fichiers du répertoire de génération») sur «Non». Assurez-vous qu'il n'est pas importé indirectement via d'autres importations.
  2. Supprimez toutes les importations de l'en-tête de préfixe qui utilisent des modules Clang (bibliothèques ou frameworks qui ont un fichier module.modulemap dans leur répertoire Headers, afin que vous puissiez écrire du code comme @import MyModule). (Pour moi, ceci et l'étape 1 étaient une seule et même chose.)
  3. Définissez le paramètre de construction pour le partage d'en-tête de préfixe sur "Oui". (Je ne pense pas que cela soit nécessaire et cela ne devrait pas avoir d'effet sur mon propre projet. Je le dis simplement parce que je l'ai changé parce que j'étais prêt à tout essayer. :))
  4. Quittez Xcode et supprimez votre répertoire DerivedData / ModuleCache (configuré pour être à ~ / Library / Developer si je me souviens bien).

Si cela ne fonctionne toujours pas, vous pouvez essayer de supprimer d'autres importations de votre en-tête de préfixe. Il y a peut-être quelque chose qui fait trébucher ...


3

On dirait qu'ils y travaillent activement selon https://forums.developer.apple.com/thread/62737 mais une solution de contournement consiste à ajouter

HEADERMAP_USES_VFS = YES

sous les paramètres de construction de votre cible (Projet -> Cible -> Paramètres de construction -> Défini par l'utilisateur).

Cette solution a fonctionné à chaque fois pour moi aujourd'hui, après qu'aucune autre solution ne fonctionnait de manière cohérente au cours du mois dernier.

EDIT: recompile encore parfois tout, bien qu'il semble le faire beaucoup moins fréquemment avec ce paramètre défini.


J'ai également ajouté cette valeur, le temps de construction est plus rapide mais cela n'a pas résolu la construction incrémentielle. J'ai changé le compilateur Swift - Génération / débogage de code en optimisation rapide et complète du module ... est le meilleur résultat à ce jour
Antonio Junior

Je ne peux même pas trouver défini par l'utilisateur)
David Seek

2
@DavidSeek c'est tout en bas des paramètres de construction
Laser Hawk


3

Vérifiez tout votre code sur les @IBDesignabledirectives dans mon cas particulier de projet de construction Xcode tout le temps car j'avais des vues sur mon storyboard qui contenaient ces @IBDesignableattributs. La deuxième chose est que mon storyboard est également ouvert dans une fenêtre séparée (pas un onglet) qui pousse mon Xcode à créer des builds pour tous les simulateurs pour toujours.


Nous utilisons un certain nombre de @IBDesignabledirectives ... y a-t-il quelque chose en particulier que nous devrions rechercher?
Stan

Je pense qu'il est possible de les trouver en les excluant un par un, et de vérifier le résultat, mon cas c'était seulement 2 des directives @IBDesignable dans tout le projet.
ua24

2

Madhuri Mane a tout à fait raison à ce sujet. Pour ajouter un peu plus de clarté, quelques points importants à noter:

Ceci est UNIQUEMENT applicable si vous avez des dépendances implicites sur des bibliothèques / frameworks sur lesquels votre cible s'appuie.

Si "Rechercher les dépendances implicites" est désactivé:

Résultat: la bibliothèque ne sera pas créée avant la création de la cible d'application. La cible d'application n'a pas pu être créée.

Correction: pour éviter que le deuxième scénario ne se produise, vous devez ajouter les cibles nécessaires dans la liste des cibles et les ordonner correctement.

Source et lectures complémentaires sur le sujet: https://pewpewthespells.com/blog/managing_xcode.html#scheme-action

Maintenant, si votre projet entier est hébergé dans une seule cible et que la compilation prend 4 minutes, vous ne pouvez pas faire grand chose à ce sujet, sauf le diviser en frameworks pour tirer parti de ce qui précède ou déterminer où la compilation est en retard. Si vous utilisez quelque chose comme PaintCode ou avez de gros morceaux de code UIKit rapidement, changez-le en Objective-c, il se compile beaucoup plus rapidement


2

Accédez aux paramètres de construction de votre cible et définissez-le Defines Modulesur Yes.

A travaillé pour moi pour quelques builds, trop tôt pour prétendre qu'il s'agit d'une solution de contournement définitive, mais au moins nous essayons.


2

Apple a publié hier une nouvelle version bêta de Xcode (14 novembre)

Xcode 8.2 beta 2

Et ce problème a été marqué comme résolu dans la note de publication.

Système de construction

• Xcode ne reconstruira pas une cible entière lorsque seuls de petits changements se sont produits. (28892475)

Ça marche pour moi. La vitesse de construction est revenue comme d'habitude. Tous ceux qui sont confrontés à ce problème devraient essayer!

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


2

Accédez au paramètre de construction du projet et modifiez le "Dialecte du langage C".

Le "Dialecte du langage C" est réglé sur "GNU99" au lieu de "Compiler Default" lorsque vous mettez à jour la version xcode. À un moment donné, Xcode n'a pas migré correctement les paramètres du projet de bibliothèque et a donc été défini sur GNU99. Cela résoudra le problème


1

Si vous avez apporté des modifications au fichier Swift, commencez à construire l'application, allez dans le dernier onglet et cliquez sur le journal de construction, pendant l'étape "Vérifier les dépendances" arrêtez la construction et exécutez-la à nouveau. Lors de la deuxième exécution, il ne devrait générer que les fichiers que vous avez modifiés. Si cela est fait correctement, j'ai trouvé que cela fonctionne à chaque fois. Pas besoin de modifier les paramètres du projet.

Cela semble être un bogue dans Xcode.

entrez la description de l'image ici

Si vous voyez que l'application effectue une compilation complète, arrêtez la compilation et réessayez cette astuce.

Si vous n'avez apporté aucune modification au code, utilisez CMD + CTRL + R pour exécuter sans générer l'application qui attache le débogueur. Ne construira pas d'application mais peut aider à gagner du temps inutile.


Cela fonctionne vraiment, mais parfois XCode échouera avec le code 1 et vous devrez créer une version propre. C'est un cauchemar
Antonio Junior

Il existe d'autres scénarios dans lesquels Xcode effectuera toujours une compilation complète. J'ai trouvé que si vous modifiez le fichier .h inclus dans l'en-tête de pontage, il reconstruira tous les fichiers Swift. Il peut y avoir d'autres scénarios qui ne sont pas liés au bogue Xcode.
Vlad

Il existe des scénarios dans lesquels le seul changement est un changement de nom de fonction ou une nouvelle propriété ajoutée à une classe / structure existante qui entraîne une reconstruction complète.
Antonio Junior

Référez-vous à cette question / réponse, ce fil est un double de ceci: Ayez une solution qui fonctionne mieux: stackoverflow.com/questions/39456223/…
Vlad

1

Problème de mon côté résolu en appliquant la décocher à la solution "Rechercher les dépendances implicites".

MAIS rappelez-vous si vous utilisez des cocoapodes, pour appliquer également ces paramètres à votre projet de pod en le sélectionnant dans

Produit -> Schéma -> Pods- "yourProjectName"

s'appliquent également dans:

Produit -> Schéma -> "yourProjectName"

Cela m'aide, alors j'espère que cet indice aidera quelqu'un d'autre.

Merci


1

Essayez de: 1. Accédez au projet 2. Cliquez sur Paramètres de génération 3. Vérifiez que OptimizationLevel est défini sur Aucun pour le débogage. 4. Cliquez sur Ajouter un paramètre défini par l'utilisateur. 5. Définissez SWIFT_WHOLE_MODULE_OPTIMIZATION sur OUI.

entrez la description de l'image ici


rien pour fonctionner il compile quand même quand j'écris une seule lettre.
Chandni

-2

pour accélérer la compilation de xcode, peut utiliser IRAMDISK (disque de mémoire virtuelle). Moyen très utile et efficace pour réduire le temps de compilation.

Peut également utiliser pour accélérer les applications fréquemment utilisées.

reportez-vous au lien suivant pour télécharger et utiliser: http://iramdisk.findmysoft.com/mac/


Cela n'accélérera pas la compilation si vous avez déjà un disque SSD.
Jano
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.