Différence entre Reconstruire et Clean + Build dans Visual Studio

Réponses:

308

Reconstruire = nettoyer + construire (généralement)

Détails notables:

  1. Pour une solution multi-projets, "reconstruire la solution" fait un "nettoyage" suivi d'une "build" pour chaque projet (éventuellement en parallèle). Alors qu'une «solution propre» suivie d'une «solution de génération» nettoie d'abord tous les projets (éventuellement en parallèle) puis construit tous les projets (éventuellement en parallèle). Cette différence de séquence des événements peut devenir significative lorsque des dépendances inter-projets entrent en jeu.

  2. Les trois actions correspondent aux cibles MSBuild. Un projet peut donc remplacer l'action Reconstruire pour faire quelque chose de complètement différent.

comte
la source
2
Vous dites donc que la reconstruction est exactement la même chose qu'un nettoyage suivi d'une construction ? C'est un peu ce que je pensais, mais je n'en étais pas sûr.
Jim McKeeth
43
Sauf que Rebuild nettoie et reconstruit chaque projet un par un. Clean + Build les nettoie tous, puis les construit tous. Fait la différence surtout si vous cliquez dessus par accident :)
Eugene
25
Sauf pour le manque de garantie qu'ils sont les mêmes. Voir la réponse de JaredPar ci-dessous qui, combinée à celle d'Earl, est toute l'image. Étant donné que la reconstruction effectue chaque projet à tour de rôle, vous pouvez avoir un "cas d'angle" lorsque vos informations de dépendance sont gâchées et que vous obtenez un projet de construction en panne de B en utilisant l'ancien projet A, puis reconstruisez A, puis reconstruisez C. etc. A full solution Clean suivi d'une compilation de solution complète corrigera cette situation alors qu'une reconstruction ne le sera pas. Donc, plus vous êtes paranoïaque et fatigué, plus vous devriez favoriser le nettoyage puis la construction.
Jason Harrison
14
Ce n'est pas vrai. J'ai eu un projet où Clean + Build a réussi et Rebuild a renvoyé des erreurs de compilation (références de fichiers circulaires). Ils ne sont donc pas 100% identiques.
Yaakov Ellis
2
Peut-être que depuis ce post, les choses ont changé, mais il y a une explication pourquoi Rebuild n'est pas (plus?) Le même que clean + build stackoverflow.com/questions/3095901/…
Dave
163

Earl a raison que 99% du temps Reconstruire = Nettoyer + Construire.

Mais ils ne sont pas garantis d'être les mêmes. Les 3 actions (reconstruire, construire, nettoyer) représentent différentes cibles MSBuild. Chacun peut être remplacé par n'importe quel fichier de projet pour effectuer des actions personnalisées. Il est donc tout à fait possible pour quelqu'un de surcharger la reconstruction pour effectuer plusieurs actions avant de lancer une construction propre + (ou de les supprimer complètement).

Très bien un cas d'angle mais le soulignant en raison des discussions sur les commentaires.

JaredPar
la source
Si vous ajoutez des actions de génération qui déplacent des fichiers .dll vers un nouvel emplacement, vous pouvez obtenir de «mauvais» résultats de génération en effectuant simplement une reconstruction. Si vous mélangez un projet vb.net et c #, les choses empirent, les concepteurs de formulaires cassés et aucun goto fonctionnel.
CodingBarfield
+1 Notez également que le comportement de reconstruction ne semble pas être cohérent entre les langues en ce qui concerne les dépendances: stackoverflow.com/questions/12163080/…
lesscode
1
99% du temps est largement surestimé.
Rhyous
58

Définissons l'implémentation de reconstruction par défaut en termes d'implémentations de nettoyage et de construction par défaut:

  1. Par projet: projet de reconstruction = projet propre + projet de construction.

  2. Par solution: Rebuild sln = foreach project in sln (Clean project + Build project).

Notez qu'en raison de différences dans l'ordre d'exécution, Reconstruire sln n'est pas identique à (Nettoyer sln + Créer sln) = (Projet foreach dans le projet Clean sln) + (Projet foreach dans le projet Build sln). En outre, ce «foreach» peut s'exécuter simultanément, de sorte que différentes tâches sont autorisées à s'exécuter simultanément dans les deux scénarios.

Supposons que vous ayez un sln contenant proj1, proj2 et proj3.

  • Reconstruire sln = (Clean proj1 + Build proj1) & (Clean proj2 + Build proj2) & (Clean proj3 + Build proj3)

  • Clean Sln + Build Sln = (Clean proj1 & Clean proj2 & Clean proj3) + (Build proj1 & Build proj2 & Build proj3)

+ signifie série, & signifie simultané.

Par conséquent, si les dépendances de projet ne sont pas configurées correctement, il est possible que lorsque vous exécutez Rebuild sln, certains de vos projets soient liés à une bibliothèque périmée. En effet, il n'est pas garanti que tous les nettoyages soient terminés avant le début de la première génération. Si vous exécutez Clean sln + Build sln, ils donneront une erreur de lien et vous le feront savoir immédiatement, au lieu de vous donner une application avec un comportement étrange.

Trout.Z
la source
7
Celui-ci est la réponse la plus exacte, car il explique pourquoi parfois je ne pouvais pas reconstruire, mais j'ai pu nettoyer + construire.
Toan Nguyen
11

De http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (il suffit de le googler):

Générer signifie compiler et lier uniquement les fichiers source qui ont changé depuis la dernière génération, tandis que Reconstruire signifie compiler et lier tous les fichiers source, qu'ils aient changé ou non. La construction est la chose normale à faire et est plus rapide. Parfois, les versions des composants cibles du projet peuvent se désynchroniser et une reconstruction est nécessaire pour réussir la génération. En pratique, vous n'avez jamais besoin de nettoyer.

Build or Rebuild Solution construit ou reconstruit tous les projets de votre solution, tandis que Build or Rebuild construit ou reconstruit le projet StartUp, "bonjour" dans la capture d'écran ci-dessus. Pour définir le projet de démarrage, cliquez avec le bouton droit sur le nom du projet souhaité dans l'onglet Explorateur de solutions et sélectionnez Définir comme projet de démarrage. Le nom du projet apparaît maintenant en gras. Étant donné que les solutions de devoirs n'ont généralement qu'un seul projet, la solution de construction ou de reconstruction est en fait la même que la construction ou la reconstruction.

Compiler compile simplement le fichier source en cours d'édition. Utile pour vérifier rapidement les erreurs lorsque le reste de vos fichiers source sont dans un état incomplet qui empêcherait une génération réussie de l'ensemble du projet. Ctrl-F7 est la touche de raccourci pour la compilation.

Eduardo Mello
la source
Comme Toan Nguyen, j'ai expérimenté que parfois la solution Clean + Build réussit là où une solution de reconstruction échoue (probablement en raison de dépendances entre les projets), donc cette réponse est trompeuse, au moins en 2018.
Jon Coombs
4

De ce billet de blog que l'auteur a lié en tant que commentaire sur cette question :

En fait non!!! ils ne sont pas égaux.

La différence réside dans la séquence des projets à nettoyer et à construire. Disons que nous avons deux projets dans une solution. Le nettoyage et la génération effectueront le nettoyage des deux projets, puis la génération se produira individuellement tandis que lors de la reconstruction, le projet A sera récupéré et nettoyé, puis généré après ce projet B sera propre, puis généré et ainsi de suite.

Prageeth godage
la source