Visual Studio przebudowuje niezmodyfikowane projekty

Tak więc, jak czytamy w tytule, mam rozwiązanie VS2010 z ~50 projektami w tej chwili. Jeśli dokonam zmiany na projekt "najwyższego poziomu", do którego nic się nie odwołuje, to VS nadal przebudowuje wszystkie 50 projektów. Uruchamiam Visual Studio 2010 Ultimate bez żadnych dodatków. Używam ILMerge do konsolidacji wszystkich projektów w jednym pliku.

Zweryfikowałem to, sprawdzając znaczniki czasu bibliotek DLL niższego poziomu i widzę, że są one rzeczywiście przebudowane, mimo że ich kod nie był wzruszony.

Przeczytałem wszystkie odpowiedzi i komentarze do:

Visual Studio 2008 trwa przebudowa

Visual studio buduje wszystko

Dziwna usterka kompilacji VS2010 występuje w moim rozwiązaniu

Powody, dla których projekty C# należy przebudować w Visual Studio

Ale większość z nich oferuje tylko sugestie dotyczące rozładunku projektów, aby przyspieszyć czas budowy, ale nic konkretnego, co do poprawki. Zastanawiam się dlaczego VS uważa, że te zależne projekty trzeba odbudować, gdy tego nie robią i naprawić.

Włączyłem "Narzędzia > Opcje>projekty i rozwiązania > Build and Run > tylko buduj projekty startowe i zależności od uruchomienia", ale bez efektu.

Ponadto, jeśli po prostu przebuduję projekt "średniego poziomu", który ma tylko 8 (w)bezpośrednich zależności, to nadal buduje wszystkie 8 projektów, mimo że ILMerge nie jest wywoływany i żaden z zależnych projektów nie został zmodyfikowany.

Dziękuję wszystkim za wszelkie wgląd może być w stanie zapewnić.

Dodano

Aby przetestować niektóre sugestie, stworzyłem nowy projekt WinForms od podstaw. Następnie stworzyłem dwa nowe projekty wewnątrz tego rozwiązania. Skopiowałem cały kod i zasoby (nie Plik projektu) z moich dwóch projektów "najniższego poziomu" do dwóch nowych projektów (zrobiłem to, upuszczając pliki i foldery z Eksploratora na projekt w Visual Studio).

Najniższy projekt, nazwijmy go B , Nie odwołaj się do innych projektów. Kolejny projekt, A , odnosi się tylko do B . Więc kiedy dodałem wymagane. NET i zewnętrzne odniesienia assembly do projektów, wtedy rozwiązanie będzie budować.

Następnie miałem mój nowy projekt WinForm reference A i zrobiłem pełną kompilację. Więc łańcuch ref jest:

WinForm -> A -> B

Potem zmodyfikowałem WinForm tylko i zrobił standardową kompilację (F6). Jak poprzednio, wizualne Studio przebudowało wszystkie trzy projekty.

Po systematycznym usuwaniu plików źródłowych w projekcie B odkryłem, że jeśli usunę moje Resources.Designer.cs i Resources.resx (i skomentuję kod, który wykorzystywał obiekt .Properties.Resourcestych zasobów) to modyfikacja WinForm nie odbuduje już całego rozwiązania, a jedynie WinForm .

Dodanie Resources.resx i Resources.Designer.cs z powrotem do projektu B (ale pozostawienie kodu komentowanego tak że nic nie korzysta z zasobów) ponownie wprowadzi pełne zachowanie budowania.

Aby sprawdzić, czy moje pliki zasobów były uszkodzone, usunąłem je ponownie ,a następnie utworzyłem Nowy (za pomocą właściwości projektu -> Zasoby) i ponownie dodałem ten sam zasób, co wcześniej, który był pojedynczym plikiem Excel. Przy tej konfiguracji pełna przebudowa nadal będzie miała miejsce.

Następnie usunąłem pojedynczy zasób, ale zostawiłem plik zasobu w projekcie B . Nawet bez dodatkowych zasobów, ale plik zasobów nadal w projekcie, pełna (niepotrzebna) przebudowa nastąpi.

Wydaje się, że samo dodanie pliku zasobów do projektu (. NET 3.5) spowoduje, że Visual Studio 2010 zawsze odbuduje ten projekt. Czy jest to błąd lub zamierzone/oczekiwane zachowanie?

Jeszcze raz dziękuję wszystkim!

Author: Community, 2013-02-17

14 answers

Otwórz Narzędzia-Opcje, wybierz projekty i rozwiązania-Build i uruchom w drzewie, a następnie Ustaw "MSBuild project build output verbosity" na Diagnostic. To wyświetli powód budowy projektu, tzn.

Projekt "ReferencedProject" nie jest aktualny. Pozycja projektu "c:\some.XML 'posiada atrybut' Copy to Output Directory 'ustawiony na ' Copy always'.

Projekt 'MyProject' nie jest aktualny. Plik wejściowy "c:\ReferencedProject.dll ' jest modyfikowany po pliku wyjściowym 'c:\MyProject.pdb".

W tym przypadku poprawką jest skopiowanie niektórych.xml tylko wtedy, gdy jest nowszy.

Zdarzenia pre i post build mogą również wywołać build.

 105
Author: user3285954,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-15 11:40:06

Chociaż nie sądzę, że jest to poprawka, jest to obejście, które zadziałało na moją sytuację...

Początkowo miałem około 5 projektów z 50, które zawierały Resources sekcję. Projekty te zawsze byĹ 'y odbudowane, a wiÄ ™ c wszystko, od czego zaleĺľaĺ' y, byĹ ' oby rĂłwnieĹĽ odbudowane. Jednym z tych 5 projektów była" podstawowa " biblioteka, do której odwoływało się 48 innych projektów, więc 96% mojego projektu było przebudowywane za każdym razem, nawet jeśli nie było to potrzebne.

Moim obejściem było użycie dependency injection, interfejsy i dedykowany projekt "Resources". Zamiast mieć te 5 projektów odwołujących się do własnego obiektu Resources, stworzyłem interfejs w każdym projekcie, który dostarczałby pożądane zasoby. Następnie klasy, które potrzebowały tych zasobów, wymagałyby przekazania interfejsu podczas ich tworzenia w konstruktorze (constructor injection).

Następnie stworzyłem oddzielny projekt "zasoby", który miał rzeczywistą sekcję zasobów jak zwykle. Ten projekt zawierał tylko same zasoby i klasę dla każdego interfejsu, która była potrzebna do zapewnienia tych zasobów za pośrednictwem interfejsu. Ten projekt odwoływałby się do każdego innego projektu, który miał zależność od zasobów i implementował interfejs, którego projekt potrzebował.

Wreszcie, w moim projekcie "najwyższego poziomu", do którego nic się nie odwoływało (i gdzie exe został faktycznie zbudowany, a mój korzeń kompozycji żyje) odniosłem się do projektu "Zasoby", podłączyłem DI i poszliśmy dalej.

To oznacza to, że tylko dwa projekty ("zasoby "i" Najwyższy Poziom") będą przebudowywane za każdym razem, a jeśli zrobię częściowy build (Shift-F6), to w ogóle nie zostaną odbudowane.

Ponownie, nie było to zbyt wielkie dzieło, ale z 48 projektami budowanymi za każdym razem, gdy budowa trwała około 3 minut, więc traciłem 30 do 90 minut dziennie z niepotrzebnymi przebudowami. Refaktorowanie zajęło trochę czasu, ale myślę, że była to dobra inwestycja.

Oto uproszczony schemat. Zauważ, że zależności od Main.exe do Proj1 i Proj2 nie są wyświetlane w celu zmniejszenia bałaganu.

Schemat roztworu

Dzięki temu projektowi mogę zbudować Proj1 lub Proj2 bez wywoływania pełnej przebudowy, ponieważ nie mają one żadnych zależności od Resources sekcji. Tylko Main wie o Resources implementacji.

 16
Author: Matt Klein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-06 15:36:59

Dzieje się tak, gdy projekt ma plik, który tak naprawdę nie istnieje.
Projekt nie może określić, czy plik został zmieniony (ponieważ go tam nie ma), więc przebudowuje.

Wystarczy spojrzeć na wszystkie pliki w projekcie i wyszukać ten, który nie ma rozwijalnej strzałki w pobliżu.

 14
Author: Yochai Timmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-28 12:08:58

Miałem ten sam problem w VS 2015.

Czym dla mnie jest sztuczka:

  1. jeden projekt odnosił się do kopii w innym koszu projektu (magicznym, tak). Tego typu rzeczy można znaleźć podczas przełączania na diagnostyczne wyjście kompilacji (w opcjach kompilacji), a następnie próby budowania projektów jeden po drugim z góry hierarchii projektów - jeśli widzisz projekt, który przebudowuje, nawet jeśli nic nie zostało zmienione, zobacz jego referencje.
  2. zmieniłem wszystkie pliki "Kopiuj zawsze" we wszystkich projektach "Kopiuj, jeśli nowsze". Zasadniczo, w sumie .pliki csproj zamieniają <CopyToOutputDirectory>Always</CopyToOutputDirectory> na <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
  3. następnie wyłączyłem tunelowanie NTFS, jak opisano w Ten artykuł z tym skryptem powershell:

New-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "MaximumTunnelEntries" -Value 0 -PropertyType "DWord"

Po tym potrzebowałem na odbudowę i wydaje się, że działa na razie.

 9
Author: Michael Logutov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-20 19:31:22

W moim przypadku winowajcą było ustawienie "Copy Local" odwołanego zestawu dll na true I "Copy to Output Directory" ustawienie pliku ustawionego na kopiowanie zawsze.

 4
Author: I-A-N,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-27 05:38:41

W końcu znalazłem jeszcze jednego winowajcę, którego trudno było znaleźć, zwiększając szczegółowość dziennika budowy.

W niektórych przypadkach MSBuild szuka vc120.pdb w folderze wyjściowym, a jeśli ten plik nie istnieje, odbuduje cały projekt. Występuje to nawet jeśli wyłączyłeś generowanie symbolu debugowania .

Obejściem jest włączenie symboli debugowania i umożliwienie wygenerowania tego pliku, a następnie ponowne wyłączenie ustawienia Bez usuwania PDB plik.

 1
Author: Mehrdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-19 01:09:49

Oto odpowiedź z VS2010 zawsze naprawia rozwiązanie?

Ten problem jest rozwiązany poprzez zmianę plików projektu, rozwiązanie czyszczenia, usuwanie wszystkich folderów bin ręcznie, ponowne uruchomienie programu Visual studio i odbudowuję wszystko.

 0
Author: Ryan Byrne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:47

Bazując na Twoich obserwacjach, wygląda na to, że masz projekty wyrażające zależności od innych projektów w sposób, który nie jest oczywisty. Osierocone zależności mogą pozostać w plikach projektu bez widoczności w interfejsie użytkownika. Czy przeglądałeś źle zachowujący się plik projektu po otwarciu go w edytorze tekstu? Sprawdzone zależności budowania rozwiązań?

Jeśli nie jesteś w stanie niczego zauważyć, spróbuj odtworzyć jeden ze swoich projektów od podstaw, aby zobaczyć, czy nowy projekt jest eksponowany ten sam problem. Jeśli czysty projekt zostanie poprawnie zbudowany, będziesz wiedział, że masz niechciane zależności wyrażone gdzieś. O ile wiem, musiałyby one znajdować się w pliku projektu lub pliku rozwiązania, chyba że masz pliki Makefile lub inne nietypowe kroki budowania.

 0
Author: Owen Wengerd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-17 03:37:23

Miałem te same problemy z Tobą. Odkryłem, że pochodzi z usuniętych plików. Kiedy usunąłem pliki z mojego projektu, problemy zniknęły. Pozdrawiam.

 0
Author: PhonPanom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-26 13:58:10

Dla tej kategorii problemów z kompilacją ustawienie wierności wyjściowej MSBuild na "diagnostyczną" jest rzeczywiście niezbędnym pierwszym krokiem. Przez większość czasu podany Powód ponownej kompilacji byłby wystarczający do działania, ale czasami MSBuild błędnie twierdzi, że niektóre pliki są modyfikowane i wymagają skopiowania.

W takim przypadku należy wyłączyć tunelowanie NTFS lub powielić folder wyjściowy w nowej lokalizacji. tutaj jest więcej słów.

 0
Author: Ofek Shilon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-16 17:58:00

Innym problemem, który często się zdarza, jest sytuacja, gdy jakiś element w Twoim rozwiązaniu ma zmodyfikowany znaczek, który jest w przyszłości. Może się to zdarzyć, jeśli ustawisz zegar do przodu, a następnie Ustaw zegar na właściwą godzinę. Zdarzyło mi się to podczas instalacji Linuksa.

W tym przypadku możesz rekurencyjnie dotknąć wszystkich plików używając git bash (tak, w Windows):

find . -exec touch {} \;
 0
Author: Mikhail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-10 05:00:40

Zespół MSBuild zbiera dokumentację dotyczącą badania problemów związanych z przyrostem kompilacji tutaj: https://github.com/Microsoft/MSBuild/wiki/Rebuilding%20when%20nothing%20changed

 0
Author: Kirill Osenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-15 19:48:04

Miałem problem z projektami przebudowy Visual Studio podczas aktualizacji z Visual Studio 2015 Do 2017 i dodaję tę odpowiedź z korzyścią dla tych, którzy mogą doświadczyć podobnych problemów, ponieważ nie wydaje się być nigdzie udokumentowane.

W moim przypadku problem polegał na tym, że wszystkie projekty w rozwiązaniu miały tę samą pośrednią ścieżkę wyjściową (obj). Plik został wygenerowany w Internaltypehelper.cs jest generowany przez wszystkie projekty zawierające XAML. Do Visual Studio 2015, proces budowania najwyraźniej nie sprawdził daty Pliku tego pliku, a zatem nie wystąpił żaden problem z nim. W VS2017 sprawdzana jest data pliku tego pliku, a ponieważ późniejszy projekt w procesie budowania nadpisze go (z tą samą zawartością), wcześniejszy projekt ponownie zbuduje, ponownie wyzwalając późniejszą kompilację, ad infinitum.

Rozwiązaniem w tym przypadku jest upewnienie się, że wszystkie projekty mają różne pośrednie katalogi wyjściowe, co sprawi, że problem zniknie.

 0
Author: Flash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 09:57:46

Miałem ten sam problem i okazało się, że jest związany z kilkoma projektami, które miały kopię lokalnego odniesienia do dll w ich własnym katalogu wyjściowym.

Kluczem do znalezienia tego było ustawienie wyjścia diagnostycznego dla wyjścia build, ale także wiedza, czego szukać w dzienniku. Szukanie: "nieaktualne " było kluczem.

 0
Author: Ademund,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-13 20:36:21