Unterschied zwischen Rebuild und Clean + Build in Visual Studio

Antworten:

308

Rebuild = Clean + Build (normalerweise)

Bemerkenswerte Details:

  1. Bei einer Lösung mit mehreren Projekten führt "Lösung neu erstellen" eine "Bereinigung" durch, gefolgt von einem "Build" für jedes Projekt (möglicherweise parallel). Während eine "saubere Lösung" gefolgt von einer "Build-Lösung" zuerst alle Projekte (möglicherweise parallel) bereinigt und dann alle Projekte (möglicherweise parallel) erstellt. Dieser Unterschied in der Reihenfolge der Ereignisse kann erheblich werden, wenn Abhängigkeiten zwischen Projekten ins Spiel kommen.

  2. Alle drei Aktionen entsprechen den MSBuild-Zielen. Ein Projekt kann also die Aktion "Neu erstellen" überschreiben, um etwas völlig anderes zu tun.

Graf
quelle
2
Sie sagen also , dass Rebuild ist genau das gleiche wie ein reinigen , gefolgt von einem Körperbau ? Das habe ich mir gedacht, war mir aber nicht sicher.
Jim McKeeth
43
Außer Rebuild bereinigt und erstellt jedes Projekt einzeln neu. Clean + Build bereinigt alle und erstellt dann alle. Macht meistens einen Unterschied, wenn Sie versehentlich darauf klicken :)
Eugene
25
Abgesehen von der fehlenden Garantie, dass sie gleich sind. Siehe JaredPars Antwort unten, die zusammen mit Earls das ganze Bild ergibt. Da Rebuild jedes Projekt der Reihe nach ausführt, können Sie einen "Eckfall" haben, wenn Ihre Abhängigkeitsinformationen durcheinander geraten und Sie ein nicht ordnungsgemäßes Build-Projekt von B mit dem alten Projekt A erhalten, dann A neu erstellen, dann C neu erstellen usw. A. Vollständige Lösung Clean, gefolgt von einem vollständigen Lösungsaufbau, wird diese Situation erfassen, während ein Neuaufbau dies nicht tut. Je paranoider und müder Sie sind, desto mehr sollten Sie Clean gegenüber Build bevorzugen.
Jason Harrison
14
Das ist nicht wahr. Ich hatte ein Projekt, in dem Clean + Build erfolgreich war und Rebuild Kompilierungsfehler (zirkuläre Dateiverweise) zurückgab. Sie sind also nicht 100% gleich.
Yaakov Ellis
2
Vielleicht haben sich die Dinge seit diesem Beitrag geändert, aber es gibt eine Erklärung, warum Rebuild nicht (nicht mehr?) Das Gleiche ist wie clean + build stackoverflow.com/questions/3095901/…
Dave
163

Earl hat Recht, dass 99% der Zeit Rebuild = Clean + Build.

Es ist jedoch nicht garantiert, dass sie gleich sind. Die 3 Aktionen (neu erstellen, erstellen, bereinigen) repräsentieren verschiedene MSBuild-Ziele. Jedes davon kann von einer beliebigen Projektdatei überschrieben werden, um benutzerdefinierte Aktionen auszuführen. Es ist also durchaus möglich, dass jemand die Neuerstellung überschreibt, um mehrere Aktionen auszuführen, bevor er einen Clean + Build initiiert (oder sie vollständig entfernt).

Sehr viel ein Eckfall, aber aufgrund von Kommentardiskussionen darauf hingewiesen.

JaredPar
quelle
Wenn Sie Build-Aktionen hinzufügen, mit denen DLL-Dateien an einen neuen Speicherort verschoben werden, können Sie durch einfaches Neuerstellen "schlechte" Build-Ergebnisse erzielen. Wenn Sie ein vb.net- und ein c # -Projekt mischen, wird es noch schlimmer, kaputte Formulardesigner und kein funktionierendes Problem.
CodingBarfield
+1 Beachten Sie auch, dass das Wiederherstellungsverhalten in
lesscode
1
99% der Zeit wird stark überschätzt.
Rhyous
58

Definieren wir die Standardimplementierung für die Neuerstellung in Bezug auf die Standardimplementierungen für Bereinigen und Erstellen:

  1. Pro Projekt: Projekt neu erstellen = Projekt bereinigen + Projekt erstellen.

  2. Pro Lösung: Erstellen Sie sln = foreach-Projekt in sln neu (Projekt bereinigen + Projekt erstellen).

Beachten Sie, dass Rebuild sln aufgrund von Unterschieden in der Ausführungsreihenfolge nicht mit (Clean sln + Build sln) = (foreach project in sln Clean project) + (foreach project in sln Build project) identisch ist. Außerdem kann dieses "foreach" gleichzeitig ausgeführt werden, sodass in beiden Szenarien unterschiedliche Aufgaben gleichzeitig ausgeführt werden können.

Angenommen, Sie haben eine SLN, die proj1, proj2 und proj3 enthält.

  • Neu erstellen sln = (Projekt proj1 + proj1 erstellen) & (Projekt2 reinigen + proj2 erstellen) & (Projekt3 reinigen + proj3 erstellen)

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

+ bedeutet seriell und bedeutet gleichzeitig.

Wenn also die Projektabhängigkeiten nicht richtig konfiguriert sind, besteht die Möglichkeit, dass beim Ausführen von Rebuild sln einige Ihrer Projekte mit einer veralteten Bibliothek verknüpft sind. Dies liegt daran, dass nicht garantiert wird, dass alle Bereinigungen abgeschlossen sind, bevor der erste Build beginnt. Wenn Sie Clean sln + Build sln ausführen, wird ein Linkfehler ausgegeben, der Sie sofort darüber informiert, anstatt Ihnen eine App mit ungewöhnlichem Verhalten zu geben.

Forelle.Z
quelle
7
Dies ist die genaueste Antwort, da sie erklärt, warum ich manchmal nicht neu erstellen konnte, aber sauber + bauen konnte.
Toan Nguyen
11

Von http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm (einfach gegoogelt):

Build bedeutet, nur die Quelldateien zu kompilieren und zu verknüpfen, die sich seit dem letzten Build geändert haben, während Rebuild bedeutet, dass alle Quelldateien kompiliert und verknüpft werden, unabhängig davon, ob sie geändert wurden oder nicht. Build ist normal und schneller. Manchmal sind die Versionen der Projektzielkomponenten nicht mehr synchron und eine Neuerstellung ist erforderlich, um den Build erfolgreich zu gestalten. In der Praxis müssen Sie nie reinigen.

Lösung erstellen oder neu erstellen erstellt oder erstellt alle Projekte in Ihrer Lösung neu, während Erstellen oder neu erstellen das StartUp-Projekt erstellt oder neu erstellt, "Hallo" im obigen Screenshot. Um das StartUp-Projekt festzulegen, klicken Sie mit der rechten Maustaste auf den gewünschten Projektnamen auf der Registerkarte Projektmappen-Explorer und wählen Sie Als StartUp-Projekt festlegen. Der Projektname wird jetzt fett angezeigt. Da die Hausaufgabenlösungen normalerweise nur ein Projekt haben, entspricht die Build- oder Rebuild-Lösung praktisch der Build- oder Rebuild-Lösung.

Kompilieren kompiliert nur die aktuell bearbeitete Quelldatei. Nützlich, um schnell nach Fehlern zu suchen, wenn sich der Rest Ihrer Quelldateien in einem unvollständigen Zustand befindet, der eine erfolgreiche Erstellung des gesamten Projekts verhindern würde. Strg-F7 ist die Tastenkombination für Kompilieren.

Eduardo Mello
quelle
Wie Toan Nguyen habe ich erfahren, dass Clean + Build Solution manchmal erfolgreich ist, wenn eine Rebuild-Lösung fehlschlägt (wahrscheinlich aufgrund von Abhängigkeiten zwischen Projekten), sodass diese Antwort zumindest 2018 irreführend ist.
Jon Coombs
4

Aus diesem Blog-Beitrag, den der Autor als Kommentar zu dieser Frage verlinkt hat :

Nicht wirklich!!! Sie sind nicht gleich.

Der Unterschied besteht in der Reihenfolge, in der Projekte sauber werden und erstellt werden. Nehmen wir an, wir haben zwei Projekte in einer Lösung. Bereinigen und dann erstellen wird für beide Projekte bereinigt und dann wird das Erstellen einzeln ausgeführt, während beim erneuten Erstellen Projekt A abgerufen und bereinigt wird und dann erstellt wird, nachdem Projekt B sauber ist und dann erstellt wird und so weiter.

Prageeth Godage
quelle