Rozwiązywanie problemów z programem MSBuild i tworzenie dzienników
Poniższe procedury mogą pomóc w diagnozowaniu problemów z kompilacją w projekcie programu Visual Studio, a w razie potrzeby utworzyć dziennik do wysłania do firmy Microsoft w celu zbadania.
Wartość właściwości jest ignorowana
Jeśli właściwość projektu wydaje się być ustawiona na określoną wartość, ale nie ma wpływu na kompilację, wykonaj następujące kroki:
Otwórz wiersz polecenia dla deweloperów programu Visual Studio odpowiadający twojej wersji programu Visual Studio.
Uruchom następujące polecenie, po zastąpieniu wartości ścieżki rozwiązania, konfiguracji i nazwy projektu:
MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
To polecenie tworzy "wstępnie przetworzony" plik projektu MSBuild (out.xml). Możesz wyszukać konkretną właściwość, aby zobaczyć, gdzie jest ona zdefiniowana.
Ostatnia definicja właściwości jest tym, z czego korzysta kompilacja. Jeśli właściwość jest ustawiana dwukrotnie, druga wartość zastępuje pierwszą. Ponadto program MSBuild ocenia projekt w kilku przebiegach:
- WłaściwościGrupy i importy
- Itemdefinitiongroups
- Grupy elementów
- Elementy docelowe
W związku z tym, biorąc pod uwagę następującą kolejność:
<PropertyGroup>
<MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
<MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
<MyItems>
<MyMetadata>$(MyProperty)</MyMetadata>
</MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
<MyProperty>B</MyProperty>
</PropertyGroup>
Wartość elementu MyFile.txt
jest obliczana MyMetadata
na B
wartość podczas kompilacji (nie A
jest pusta).
Kompilacja przyrostowa tworzy więcej niż powinna
Jeśli program MSBuild niepotrzebnie kompiluje projekt lub element projektu, utwórz szczegółowy lub binarny dziennik kompilacji. Możesz wyszukać w dzienniku plik, który został skompilowany lub skompilowany niepotrzebnie. Dane wyjściowe wyglądają mniej więcej tak:
Task "CL"
Using cached input dependency table built from:
F:\test\Project1\Project1\Debug\Project1.tlog\CL.read.1.tlog
Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
Project1.cpp will be compiled because F:\TEST\PROJECT1\PROJECT1\PROJECT1.H was modified at 6/5/2019 12:37:09 PM.
Outputs for F:\TEST\PROJECT1\PROJECT1\PROJECT1.CPP:
F:\TEST\PROJECT1\PROJECT1\DEBUG\PROJECT1.OBJ
Write Tracking Logs:
Debug\Project1.tlog\CL.write.1.tlog
Jeśli tworzysz w środowisku IDE programu Visual Studio (ze szczegółową szczegółowością okna danych wyjściowych), w oknie Dane wyjściowe zostanie wyświetlony powód, dla którego każdy projekt nie jest aktualny:
1>------ Up-To-Date check: Project: Project1, Configuration: Debug Win32 ------
1>Project is not up-to-date: build input 'f:\test\project1\project1\project1.h' was modified after the last build finished.
Tworzenie szczegółowego dziennika
W menu głównym programu Visual Studio przejdź do pozycji Narzędzia>Opcje>Projekty i rozwiązania>Kompilowanie i uruchamianie.
Ustaw szczegółowość kompilacji projektu MSBuild na Wartość Szczegółowa w obu polach kombi. Pierwszy steruje szczegółowością kompilacji w oknie danych wyjściowych, a drugi steruje szczegółowością kompilacji w
{projectname}.log
pliku utworzonym w katalogu pośrednim każdego projektu podczas kompilacji.W wierszu polecenia dla deweloperów programu Visual Studio wprowadź jedno z tych poleceń, podstawiając rzeczywiste wartości ścieżki i konfiguracji:
MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
lub
MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
Plik
MSBuild.log
jest tworzony w katalogu, z którego uruchomiono program MSBuild.
Podaj dzienniki binarne programu MSBuild na potrzeby badania
Program MSBuild ma możliwość przechwytywania szczegółowego pliku dziennika binarnego. Jeśli masz problem z kompilacją i możesz podać dziennik binarny, dziennik może być przydatny do zbadania problemu.
Należy jednak pamiętać, jakiego typu informacje są przechwytywane w dzienniku binarnym, aby upewnić się, że nie udostępniasz przypadkowo więcej niż zamierzasz. Dziennik binarny przechwytuje prawie wszystko, co robi kompilacja, w tym zawartość plików projektu i wszystkich plików (takich jak .props
i .targets
), które importują, wszystkie zadania uruchamiane podczas kompilacji, a także dane wejściowe i wyjściowe, a także zmienne środowiskowe, do których uzyskiwano dostęp w tej sesji programu MSBuild. Zazwyczaj nie zawiera on zawartości skompilowanych plików źródłowych, ale przechwytuje ich pełne nazwy i ścieżki.
Uwaga
Niektóre środowiska kompilacji udostępniają wpisy tajne przy użyciu zmiennych środowiskowych. Przed udostępnieniem dziennika binarnego upewnij się, że nie uwidacznia tokenów interfejsu API ani innych ważnych wpisów tajnych.
Przechwytywanie dzienników binarnych dla kompilacji wiersza polecenia
Dziennik binarny można utworzyć, przekazując -bl
parametr do programu MSBuild (MSBuild.exe
lub dotnet build
). Zawartość wygenerowanego pliku można eksplorować przy użyciu przeglądarki dzienników ustrukturyzowanych .binlog
MSBuild lub w przeglądarce przy użyciu podglądu dzienników strukturalnych na żywo. Program MSBuild nie przechwytuje żadnych danych z dzienników binarnych wyświetlanych w przeglądarce.
Przykłady
dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release
Zobacz również więcej szczegółów na temat dzienników binarnych.
Przechwytywanie dzienników binarnych za pomocą programu Visual Studio
Aby przechwycić dzienniki dla wszystkich wywołań programu MSBuild:
Ustaw MSBUILDDEBUGENGINE
zmienną środowiskową na '1'
i (opcjonalnie) ustaw na MSBUILDDEBUGPATH
istniejący folder docelowy, aby przechowywać przechwycone dzienniki. Następnie uruchom program Visual Studio z tej samej powłoki, aby dziedziczyć środowisko:
SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln
Dzienniki binarne programu MSBuild są następnie przechwytywane do lokalizacji określonej za pomocą MSBUILDDEBUGPATH
zmiennej środowiskowej (lub domyślnie do MSBuild_Logs
podfolderu bieżącego folderu lub %temp%
, na podstawie praw dostępu).
Uwaga
Dzienniki są rejestrowane dla każdego wywołania programu MSBuild (w tym kompilacji czasu projektowania) i przechowywane w folderze bez usuwania starszych — dzięki czemu liczba plików dziennika może szybko wzrosnąć. Zaleca się ustawienie zmiennej środowiskowej opt-in tylko przez krótki czas odtwarzania problemu do zbadania (choć zrozumiałe jest, że niektóre nieokreślone problemy mogą wymagać wielu prób odtworzenia).
Tworzenie binarnego dziennika MSBuild przy użyciu rozszerzenia Project System Tools
Zapoznaj się z tym przewodnikiem w repozytorium Project System Tools, aby przechwytywać dzienniki binlogów za pomocą programu Visual Studio.
Pobierz i zainstaluj rozszerzenie Project System Tools.
Po zainstalowaniu rozszerzenia niektóre nowe elementy są wyświetlane w menu Wyświetl>inne okna.
Wybierz pozycję Wyświetl>inne rejestrowanie kompilacji systemu Windows>, aby wyświetlić okno Rejestrowanie kompilacji w programie Visual Studio. Wybierz pierwszą ikonę paska narzędzi, aby rozpocząć rejestrowanie zarówno regularnych, jak i projektowych kompilacji w systemie projektu.
Po zarejestrowaniu kompilacji zostanie ona wyświetlona w oknie Rejestrowanie kompilacji. Kliknij prawym przyciskiem myszy element i wybierz polecenie Zapisz dzienniki w menu kontekstowym, aby zapisać
.binlog
plik.
Pliki binlog można wyświetlać i przeszukiwać za pomocą przeglądarki dzienników strukturalnych aparatu MSBuild.