Różnica między Rebuild a Clean + Build w Visual Studio


Odpowiedzi:


308

Przebuduj = Clean + Build (zwykle)

Ważne szczegóły:

  1. W przypadku rozwiązania obejmującego wiele projektów „przebuduj rozwiązanie” wykonuje „czyste”, a następnie „kompilację” dla każdego projektu (możliwie równolegle). Natomiast „czyste rozwiązanie”, a następnie „rozwiązanie kompilacji” najpierw czyści wszystkie projekty (być może równolegle), a następnie buduje wszystkie projekty (być może równolegle). Ta różnica w sekwencji zdarzeń może stać się znacząca, gdy pojawią się zależności między projektami.

  2. Wszystkie trzy działania odpowiadają celom MSBuild. Tak więc projekt może zastąpić akcję Przebuduj, aby zrobić coś zupełnie innego.


2
Więc mówisz, że Przebudowa jest dokładnie taka sama jak Czysta, a następnie Kompilacja ? Tak myślałem, ale nie byłem pewien.
Jim McKeeth,

43
Z wyjątkiem Rebuild czyści i przebudowuje każdy projekt jeden po drugim. Clean + Build czyści je wszystkie, a następnie buduje je wszystkie. Różnica jest większa, jeśli klikniesz ją przypadkowo :)
Eugene

25
Z wyjątkiem braku gwarancji, że są takie same. Zobacz odpowiedź JaredPara poniżej, która w połączeniu z Earl's to cały obraz. Ponieważ Rebuild wykonuje po kolei każdy projekt, możesz mieć „przypadek narożny”, gdy twoje informacje o zależnościach są pomieszane i dostajesz nieczynny projekt kompilacji B przy użyciu starego projektu A, następnie odbuduj A, a następnie odbuduj C. itd. A pełne rozwiązanie Czyszczenie, po którym następuje pełna kompilacja rozwiązania, wychwyci tę sytuację, a odbudowa nie. Im bardziej jesteś paranoikiem i zmęczony, tym bardziej powinieneś faworyzować Clean, a potem Build.
Jason Harrison,

14
To nie jest prawda. Miałem projekt, w którym Clean + Build się powiodło, a Rebuild zwróciła błędy kompilacji (odwołania do plików cyklicznych). Nie są więc w 100% takie same.
Yaakov Ellis

2
Może od czasu tego postu wszystko się zmieniło, ale istnieje wyjaśnienie, dlaczego Rebuild nie jest (już?) Taki sam jak clean + build stackoverflow.com/questions/3095901/...
Dave

163

Earl ma rację, że 99% czasu Rebuild = Clean + Build.

Ale nie gwarantuje się, że będą takie same. 3 akcje (przebuduj, skompiluj, wyczyść) reprezentują różne cele MSBuild. Każdy z nich można zastąpić dowolnym plikiem projektu w celu wykonania niestandardowych działań. Jest więc całkowicie możliwe, że ktoś zastąpi przebudowę, wykonując kilka akcji przed zainicjowaniem czystej + kompilacji (lub całkowicie ją usuwając).

Bardzo ważna sprawa, ale wskazanie jej z powodu dyskusji na temat komentarzy.


Jeśli dodasz akcje kompilacji, które przenoszą pliki .dll do nowej lokalizacji, możesz uzyskać „złe” wyniki kompilacji, po prostu wykonując przebudowę. Jeśli połączysz projekt vb.net i c #, sytuacja stanie się jeszcze gorsza, zepsute projektanci formularzy i brak działającego goto.
CodingBarfield

+1 Zauważ też, że zachowanie Odbuduj nie wydaje się być spójne we wszystkich językach w odniesieniu do zależności: stackoverflow.com/questions/12163080/…
lesscode

1
99% czasu jest znacznie zawyżone.
Rhyous,

57

Zdefiniujmy domyślną implementację Rebuild pod względem domyślnych implementacji Clean i Build:

  1. Na projekt: Przebuduj projekt = Wyczyść projekt + Zbuduj projekt.

  2. Dla rozwiązania: Przebuduj sln = foreach project in sln (Clean project + Build project).

Zauważ, że z powodu różnic w kolejności wykonywania, Przebuduj sln nie jest tym samym, co (Wyczyść sln + kompilacja sln) = (foreach projekt w sln Wyczyść projekt) + (foreach projekt w sln Kompilacja projektu). Ponadto to „foreach” może być wykonywane jednocześnie, więc różne zadania mogą być uruchamiane jednocześnie w dwóch scenariuszach.

Załóżmy, że masz SLN, który zawiera proj1, proj2 i proj3.

  • Przebuduj 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)

+ oznacza szeregowy i oznacza równoczesny.

Jeśli więc zależności projektu nie zostaną poprawnie skonfigurowane, istnieje szansa, że ​​po uruchomieniu Przebuduj sln, niektóre z twoich projektów zawierają linki do przestarzałej biblioteki lib. Jest tak, ponieważ nie można zagwarantować, że wszystkie operacje czyszczenia zostaną zakończone przed rozpoczęciem pierwszej kompilacji. Jeśli wykonasz Clean sln + Build sln, podadzą ci błąd łącza i poinformują cię o tym natychmiast, zamiast dać ci aplikację o dziwnym zachowaniu.


7
To jest najdokładniejsza odpowiedź, ponieważ wyjaśnia, dlaczego czasami nie mogłem odbudować, ale byłem w stanie wyczyścić + zbudować.
Toan Nguyen

11

From http://www.cs.tufts.edu/r/graphics/resources/vs_getting_started/vs_getting_started.htm , (po prostu googlował):

Kompilacja oznacza kompilację i dowiązanie tylko plików źródłowych, które zmieniły się od czasu ostatniej kompilacji, natomiast Rebuild oznacza kompilację i dowiązanie wszystkich plików źródłowych, niezależnie od tego, czy uległy one zmianie. Kompilacja jest normalną rzeczą do zrobienia i jest szybsza. Czasami wersje komponentów docelowych projektu mogą się nie zsynchronizować i konieczna jest przebudowa, aby kompilacja zakończyła się powodzeniem. W praktyce nigdy nie trzeba czyścić.

Build lub Rebuild Solution buduje lub przebudowuje wszystkie projekty w twoim rozwiązaniu, podczas gdy Build lub Rebuild buduje lub przebudowuje projekt StartUp, „cześć” na zrzucie ekranu powyżej. Aby ustawić projekt StartUp, kliknij prawym przyciskiem myszy żądaną nazwę projektu na karcie Solution Explorer i wybierz opcję Ustaw jako projekt StartUp. Nazwa projektu jest teraz pogrubiona. Ponieważ rozwiązania zadań domowych mają zwykle tylko jeden projekt, Kompilacja lub przebudowa jest w rzeczywistości taka sama jak kompilacja lub przebudowa.

Kompilacja po prostu kompiluje aktualnie edytowany plik źródłowy. Przydatne do szybkiego sprawdzania błędów, gdy reszta plików źródłowych jest w niepełnym stanie, co uniemożliwiłoby pomyślną kompilację całego projektu. Ctrl-F7 to klawisz skrótu do kompilacji.


Podobnie jak Toan Nguyen, zauważyłem, że czasami rozwiązanie Clean + Build kończy się niepowodzeniem w przypadku niepowodzenia rozwiązania przebudowy (prawdopodobnie z powodu zależności między projektami), więc ta odpowiedź jest myląca, przynajmniej w 2018 r.
Jon Coombs

4

Z tego postu na blogu, który autor umieścił jako komentarz do tego pytania :

Właściwie nie!!! nie są równi.

Różnica polega na tym, że sekwencje projektów są czyszczone i budowane. Powiedzmy, że mamy dwa projekty w rozwiązaniu. Wyczyść, a następnie kompilacja wykona czyszczenie dla obu projektów, a następnie kompilacja nastąpi indywidualnie, podczas gdy przy odbudowie projekt A dostanie i wyczyści, a następnie skompiluje po tym projekcie B zostanie wyczyszczony, a następnie kompilacja i tak dalej.

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.