Różnica między kompilacją, przebudową i czystym rozwiązaniem w Visual Studio?

Odpowiedzi:

921
  • Rozwiązanie kompilacji wykona przyrostową kompilację: jeśli nie uzna , że musi odbudować projekt, nie zrobi tego. Może także użyć częściowo zbudowanych fragmentów projektu, jeśli się nie zmieniły (nie wiem, jak daleko to zajdzie)
  • Przebuduj rozwiązanie wyczyści, a następnie zbuduje rozwiązanie od zera, ignorując wszystko, co zostało zrobione wcześniej. Różnica między tym a „Wyczyść, a następnie Kompilacja” polega na tym, że Rebuild wyczyści, a następnie zbuduje każdy projekt, jeden po drugim, zamiast czyszczenia wszystkich, a następnie budowania wszystkich.
  • Czyste rozwiązanie usunie artefakty kompilacji z poprzedniej kompilacji. Jeśli w katalogach docelowych kompilacji (bin i obj) znajdują się inne pliki, nie można ich usunąć, ale są to artefakty kompilacji. Widziałem, że zachowanie jest różne - czasami dość dokładnie usuwane, a czasem nie - ale na razie dam VS wątpliwości.

(Łącza prowadzą do przełączników wiersza polecenia devenv.exe , ale działają tak samo jak elementy menu).

Jon Skeet
źródło
2
@womp: Nie w projekcie, na który właśnie patrzyłem. Wciąż są tam wszystkie zgromadzenia ...
Jon Skeet
1
@Jon - dziwne. Nie przypominam sobie, żeby czysty nigdy nie sprzątał tych katalogów. Robię to teraz i czyści wszystkie pliki .dll i .pdb. Zdecydowanie pozostawia moje śmieci ReSharper w spokoju.
womp
156
Osobiście uważam, że „Clean Solution” jest więcej niż nieprzydatne. Jeśli naprawdę chcę, aby było czyste, najlepiej jest ręcznie usunąć foldery bin i obj. Zostały nawet przyłapane na ściganiu fantomowych „błędów” - dopóki tego nie zrobiłem. Czyszczenie po prostu nie jest niezawodne.
Chris Rogers
7
jeśli artefakty przedostały się w inny sposób niż przez kompilacje (np. kopia z innego źródła zintegrowana jako msbuidltask w cproj), to czyste pozostawia je. Co czyni go praktycznie bezużytecznym, powiedziałbym nawet, że jest niebezpieczny, ponieważ pozostawi cię w fałszywym poczuciu czystości.
Newtopian
4
@verdana: W przypadku github itp. łatwiej jest mieć przyzwoity .gitignoreplik. Ale zgodnie z odpowiedzią, Clean nie zawsze wykonuje szczególnie dokładną pracę z mojego doświadczenia.
Jon Skeet
455

Kompilacja rozwiązania: Kompiluje pliki kodu (DLL i EXE), które są zmieniane.

Przebuduj: usuwa wszystkie skompilowane pliki i kompiluje je ponownie, niezależnie od tego, czy kod się zmienił, czy nie.

Czyste rozwiązanie: usuwa wszystkie skompilowane pliki (pliki DLL i EXE).

Możesz obejrzeć ten film na YouTube ( Visual Studio Build vs. Rebuild vs. Clean (pytania do wywiadu w C # z odpowiedziami) ), w którym pokazałem różnice, a poniżej znajdują się reprezentacje wizualne, które pomogą ci przeanalizować to samo bardziej szczegółowo.

Build vs Rebuild

Różnica między Rebuild vs. (Clean + Build), ponieważ wydaje się, że istnieje pewne zamieszanie wokół tego:

Różnica polega na sposobie budowania i czyszczenia sekwencji dla każdego projektu. Powiedzmy, że twoje rozwiązanie ma dwa projekty: „proj1” i „proj2”. Jeśli wykonasz przebudowę, zajmie „proj1”, wyczyść (usuń) skompilowane pliki dla „proj1” i skompiluj go. Następnie zajmie się drugim projektem „proj2”, wyczyści skompilowane pliki dla „proj2” i skompiluje „proj2”.

Ale jeśli wykonasz „czyszczenie” i kompilację, najpierw usunie wszystkie skompilowane pliki dla „proj1” i „proj2”, a następnie najpierw zbuduje „proj1”, a następnie „proj2”.

Odbuduj Vs Clean

Shivprasad Koirala
źródło
26
Dziękujemy za wyjaśnienie, dlaczego Rebuild nie zawsze działa i często muszę wyczyścić przed wykonaniem kompilacji.
Didier A.
4
Tak, opis i drugi schemat były bardzo pomocne i jasne. Gdybyś mógł naprawić „nielegalny” schemat blokowy, aby Tak dotarł tylko do jednego miejsca, to by pomogło. Naprawdę nie rozumiem tego, co ten próbuje powiedzieć, zwłaszcza z „Build ALL” w „Rebuild”.
Jon Coombs,
@JonCoombs Tak, nie sądzę, że pierwszy schemat blokowy uchwycił dokładnie to, co powiedział na wideo. Myślę, że obraz, który wstawiłem, jest tym, do czego zmierzał Shivprasad.
ruffin
Rozumiem to, jeśli jakikolwiek plik się zmienił, projekt jest czyszczony na zwykłej kompilacji, co oznacza, że ​​albo nic nie zrobi, albo wyczyści, a następnie skompiluje projekt. Czy to jest poprawne?
Jaśniejsze
147

Zaczerpnięte z tego linku :

Kompilacja oznacza kompilację i dowiązanie tylko plików źródłowych, które zmieniły się od czasu ostatniej kompilacji, natomiast Odbuduj oznacza kompilację i dowiązanie wszystkich plików źródłowych bez względu na to, czy uległy one zmianie. Kompilacja jest normalną rzeczą i jest szybsza. Czasami wersje komponentów docelowych projektu mogą się nie zsynchronizować i konieczna jest przebudowa, aby kompilacja przebiegła pomyślnie. W praktyce nigdy nie trzeba czyścić.

Matthew Jones
źródło
1
Połączyć? Myślałem, że idea DLL, czyli Dynamic Link Library, polega na łączeniu w czasie wykonywania?
Dag
7
„W praktyce nigdy nie trzeba czyścić” <- w tej sprawie nazywam BS.
mola7
2
mola7 czy możesz podać powód, dla którego chcesz wyczyścić kontra przebudować?
PaulBinder
1
@PaulBinder Nie musisz szukać zbyt daleko.
JakeD,
46

Kompiluj rozwiązanie - buduje wszystkie zestawy, które zmieniły pliki. Jeśli zespół nie ma zmian, nie zostanie odbudowany. Nie usunie również żadnych plików pośrednich.

Najczęściej używane.

Przebuduj rozwiązanie - Odbudowuje wszystkie zestawy niezależnie od zmian, ale pozostawia pliki pośrednie.

Używane, gdy zauważysz, że program Visual Studio nie uwzględnił twoich zmian w najnowszym zestawie. Czasami Visual Studio popełnia błędy.

Wyczyść rozwiązanie - Usuń wszystkie pliki pośrednie.

Używane, gdy wszystko inne zawiedzie i musisz wszystko wyczyścić i zacząć od nowa.

Justin Niessner
źródło
25
Clean nie tworzy kompilacji.
Jon Skeet
3
@Jon Skeet - Codziennie ucz się czegoś nowego. Przysiągłbym, że to przebudowa. Wydaje mi się, że moja pamięć nie zawsze jest tak niezawodna, jak bym chciał.
Justin Niessner
16

Po prostu myślę o Przebuduj jako o wykonywaniu najpierw Czystości, a następnie Kompilacji. Może się mylę ... komentarze?

Ken Richards
źródło
To nie miało żadnych pozytywnych opinii (do tej pory) i zgodnie z dokumentami (patrz link w odpowiedzi Jona) jest to dokładnie słuszne.
Tod
2
Nie sądzę, że tak. Mam sytuację, w której wykonanie Clean Solution, a następnie Build Solution działa, ale wykonanie Rebuild Solution kończy się niepowodzeniem. Dotyczy to świeżo utworzonego rozwiązania z 2 projektami (jeden zależny od drugiego).
Cthutu
@Cthutu Zobacz odpowiedź Shivprasad, aby poznać szczegóły, które mają znaczenie tutaj. Przebuduj czyści, a następnie buduje każdy projekt na raz, podczas gdy uruchomienie Clean najpierw czyści wszystko naraz, a następnie Build buduje wszystko naraz. Natknąłem się na przypadki, w których ta zmiana w kolejności czyszczenia / kompilacji również odróżnia kompilowanie od kompilacji.
Sean
@Sean Być może było to spowodowane dodaniem projektu do rozwiązania jako file referencezamiast, project referencewięc kolejność kompilacji projektu nie rozpoznała, że ​​musi on zbudować określony projekt przed innym, a zespół nie istniał tam, gdzie powinien być podczas budować?
Zack
14

Kompiluj rozwiązanie - buduje wszystkie zestawy, które zmieniły pliki. Jeśli zespół nie ma zmian, nie zostanie odbudowany. Nie usunie również żadnych plików pośrednich.

Przebuduj rozwiązanie wyczyści, a następnie zbuduje rozwiązanie od zera, ignorując wszystko, co zostało zrobione wcześniej

Clean Solution usunie wszystkie skompilowane pliki (tj. Pliki EXE i DLL) z katalogu bin / obj.

Guilherme Fidelis
źródło
8

Kompilacja rozwiązania zbuduje wszelkie projekty w rozwiązaniu, które uległy zmianie. Rebuild buduje wszystkie projekty bez względu na wszystko, czyste rozwiązanie usuwa wszystkie pliki tymczasowe, zapewniając, że następna kompilacja jest zakończona.

Steven Evers
źródło
6

Kompiluj kompilację - Kompiluj kompilację zbuduje twoją aplikację wraz z budowaniem liczby projektów, które mają dowolną zmianę pliku. I nie usuwa żadnych istniejących plików binarnych, a jedynie zastępuje zaktualizowane zestawy w folderze bin lub obj.

Przebuduj rozwiązanie - Przebuduj rozwiązanie zbuduje całą aplikację z budowaniem wszystkich projektów dostępnych w rozwiązaniu z ich czyszczeniem. Przed zbudowaniem usuwa wszystkie pliki binarne z folderu bin i obj.

Czyste rozwiązanie - Czyste rozwiązanie to po prostu usuwa wszystkie pliki binarne z folderu bin i obj.

Sabaridass R.
źródło
5

Zbuduj rozwiązanie

Spowoduje to wykonanie przyrostowej kompilacji. Innymi słowy, będzie budować tylko pliki kodu, które uległy zmianie. Jeśli się nie zmieniły, pliki te nie zostaną dotknięte.

Przebuduj rozwiązanie

Spowoduje to usunięcie wszystkich aktualnie skompilowanych plików (tj. Exe i bibliotek DLL) i zbuduje wszystko od zera, niezależnie od tego, czy w pliku jest zmiana kodu, czy nie.

Menu czystego rozwiązania

To menu usuwa wszystkie skompilowane pliki (tj. Pliki EXE i DLL) z katalogu bin / obj.

Przebuduj = Clean + Build

Sajisha
źródło
4

Jedną z głównych rzeczy, które, jak sądzę, ludzie pomijają, jest to, że zarówno Build, jak i Clean są zadaniami wykonywanymi w oparciu o wiedzę Visual Studio na temat Twojego projektu / rozwiązania. Widzę wiele skarg, że Clean nie działa lub pozostawia resztki plików lub nie jest godny zaufania, podczas gdy w rzeczywistości powody, dla których mówisz, że nie są godne zaufania, w rzeczywistości sprawiają, że jest bardziej godny zaufania.

Wyczyść usunie tylko (wyczyści) pliki i / lub katalogi utworzone przez Visual Studio lub sam kompilator. Jeśli skopiujesz własne pliki lub struktury plików / folderów zostaną utworzone z zewnętrznego narzędzia lub źródła, program Visual Studio nie będzie wiedział, że istnieją i dlatego nie powinien ich dotykać.

Czy możesz sobie wyobrazić, czy operacja czyszczenia zasadniczo wykonała „del *. *”? To może być katastrofalne.

Kompilacja wykonuje kompilację zmienionych lub niezbędnych projektów.

Przebuduj wykonuje kompilację bez względu na zmianę lub to, co jest konieczne.

Clean usuwa pliki / foldery, które utworzył w przeszłości, ale pozostawia wszystko, z czym początkowo nie miało nic wspólnego.

Mam nadzieję, że to trochę rozwinie i pomoże.

Gonić
źródło
4

Mam aa rozwiązanie pusty BuildRebuildCleani trzy klasy biblioteki Models, Repository, Notification.

Używam Modelsoraz Repositoryw Notificationbibliotece klasy.

Następnie:

  • Kompilacja kompilacji Przyrostowa kompilacja i kompilacja tylko tych plików, które zostały zmienione. Jeśli zespół nie ma zmian, nie zostanie odbudowany. Ponadto nie usunie żadnych plików pośrednich. Jeśli zmodyfikujesz jakiś kod w Modelsprojekcie biblioteki, wtedy BUDUJ rozwiązanie. Na poniższym zrzucie ekranu zapoznaj się ze znacznikiem czasu biblioteki DLL, zaktualizowano plik EXE Modelsi Notificationbibliotekę.

wprowadź opis zdjęcia tutaj

  • Przebuduj rozwiązanie Usuwa wszystkie skompilowane pliki i kompiluje wszystkie bez względu na zmiany, ignorując wszystko, co zrobiono wcześniej. Kliknij prawym przyciskiem myszy nazwę rozwiązania BuildRebuildClean. To, co robi, to usuwa wszystkie zestawy, pliki EXE i pliki referencyjne w celu ponownej kompilacji.

wprowadź opis zdjęcia tutaj

  • Wyczyść rozwiązanie Usuwa wszystkie skompilowane pliki pośrednie (tj. EXE i DLL) z katalogu bin / obj.

wprowadź opis zdjęcia tutaj

Reza Jenabi
źródło
2

Wiem tylko, że Clean nie robi tego, co zwykło robić „clean” - jeśli wyczyściłem rozwiązanie, oczekiwałbym, że usunie obiekty i pliki bin / foldery, które buduje tak, jakby był świeżą kasą źródła. Z mojego doświadczenia wynika jednak, że często znajduję czasy, w których czyszczenie i kompilacja lub przebudowa nadal powodują dziwne błędy w źródle, o których wiadomo, że się kompilują, a wymagane jest ręczne usunięcie folderów bin / obj, a następnie kompilacja.

Steve
źródło
Szczególnie w projektach Xamarin muszę ręcznie usuwać foldery bin i obj, aby rozwiązać dziwne błędy kompilacji
Miguel Febres
0

Dotyczy to tylko opcji „Kompiluj rozwiązanie”.

Całkowicie mam dość niezdolności Visual Studio do naprawdę czystych rozwiązań i napisałem to małe narzędzie , które zrobi to za Ciebie.

Najpierw zamknij swoje rozwiązanie w VS i przeciągnij jego folder z Eksploratora Windows do tej aplikacji lub do jego ikony. W zależności od ustawienia w dolnej części okna może również usunąć dodatkowe elementy, które pomogą, jeśli spróbujesz ręcznie przesłać swoje rozwiązanie do GitHub lub udostępnić je komuś innemu:

wprowadź opis zdjęcia tutaj

Krótko mówiąc, umieści wszystkie foldery „Debugowanie”, Intellisense i inne pamięci podręczne, które VS może odbudować w Koszu.

ahmd0
źródło