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:

  1. Otwórz wiersz polecenia dla deweloperów programu Visual Studio odpowiadający twojej wersji programu Visual Studio.

  2. 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

  1. W menu głównym programu Visual Studio przejdź do pozycji Narzędzia>Opcje>Projekty i rozwiązania>Kompilowanie i uruchamianie.

  2. 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.

  3. 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.

  1. Pobierz i zainstaluj rozszerzenie Project System Tools.

  2. Po zainstalowaniu rozszerzenia niektóre nowe elementy są wyświetlane w menu Wyświetl>inne okna.

    Other Windows menu

  3. 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.

    Build logging window

  4. 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.

    Build logging context menu

Pliki binlog można wyświetlać i przeszukiwać za pomocą przeglądarki dzienników strukturalnych aparatu MSBuild.