Řešení potíží s msBuildem a vytváření protokolů

Následující postupy vám můžou pomoct diagnostikovat problémy s sestavením v projektu sady Visual Studio a v případě potřeby vytvořit protokol pro odeslání do Microsoftu pro účely šetření.

Hodnota vlastnosti je ignorována.

Pokud se zdá, že vlastnost projektu je nastavená na konkrétní hodnotu, ale nemá žádný vliv na sestavení, postupujte takto:

  1. Otevřete příkazový řádek pro vývojáře sady Visual Studio, který odpovídá vaší verzi sady Visual Studio.

  2. Po nahrazení hodnot cesty řešení, konfigurace a názvu projektu spusťte následující příkaz:

    MSBuild /p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /pp:out.xml MyProject.vcxproj
    

    Tento příkaz vytvoří "předzpracovaný" soubor projektu MSBuild (out.xml). V tomto souboru můžete vyhledat konkrétní vlastnost a zjistit, kde je definovaná.

Poslední definicí vlastnosti je to, co sestavení využívá. Pokud je vlastnost nastavena dvakrát, druhá hodnota přepíše první. Nástroj MSBuild také vyhodnocuje projekt v několika průchodech:

  • PropertyGroups a Import
  • ItemDefinitionGroups
  • ItemGroups
  • Cíle

Proto je dáno následující pořadí:

<PropertyGroup>
   <MyProperty>A</MyProperty>
</PropertyGroup>
<ItemGroup>
   <MyItems Include="MyFile.txt"/>
</ItemGroup>
<ItemDefinitionGroup>
  <MyItems>
      <MyMetadata>$(MyProperty)</MyMetadata>
  </MyItems>
</ItemDefinitionGroup>
<PropertyGroup>
   <MyProperty>B</MyProperty>
</PropertyGroup>

Hodnota MyMetadata položky MyFile.txt se vyhodnocuje B během sestavení (ne A prázdné).

Přírůstkové sestavení vytváří více, než by mělo

Pokud nástroj MSBuild zbytečně znovu sestavuje projekt nebo položku projektu, vytvořte podrobný nebo binární protokol sestavení. V protokolu můžete vyhledat soubor, který byl sestaven nebo kompilován zbytečně. Výstup vypadá přibližně takto:

  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

Pokud vytváříte v integrovaném vývojovém prostředí sady Visual Studio (s podrobnou podrobností okna výstupu), zobrazí se v okně výstupu důvod, proč každý projekt není aktuální:

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.

Vytvoření podrobného protokolu

  1. V hlavní nabídce sady Visual Studio přejděte do části Projekty možností>nástrojů>a sestavení a spuštění řešení.>

  2. V obou polích se seznamem nastavte úroveň podrobností sestavení projektu MSBuild. Horní jedna řídí úroveň podrobností sestavení v okně výstupu a druhá řídí úroveň podrobností v {projectname}.log souboru vytvořeném v zprostředkujícím adresáři každého projektu během sestavování.

  3. Na příkazovém řádku vývojáře sady Visual Studio zadejte jeden z těchto příkazů a nahraďte skutečné hodnoty cesty a konfigurace:

    MSBuild /p:Configuration="MyConfiguration";Platform="x86" /fl MySolution.sln
    

    nebo

    MSBuild /p:/p:SolutionDir="c:\MySolutionDir\";Configuration="MyConfiguration";Platform="Win32" /fl MyProject.vcxproj
    

    V MSBuild.log adresáři, ze kterého jste spustili nástroj MSBuild, se vytvoří soubor.

Zadání binárních protokolů NÁSTROJE MSBuild pro šetření

Nástroj MSBuild má možnost zachytit podrobný soubor binárního protokolu. Pokud máte problém s sestavením a máte možnost poskytnout binární protokol, může být tento protokol užitečný pro zkoumání problému.

Měli byste ale vědět, jaký typ informací se zaznamenává v binárním protokolu, abyste měli jistotu, že nechtěně nesdílíte více, než máte v úmyslu. Binární protokol zachycuje téměř vše, co vaše sestavení dělá, včetně obsahu souborů projektu a všech souborů (například .props a .targets), které importují, všech úkolů, které se spouští během sestavení, a také vstupních a výstupních proměnných prostředí, ke kterým se přistupuje v dané relaci NÁSTROJE MSBuild. Obecně neobsahuje obsah zdrojových souborů, které jsou zkompilovány, ale zachycuje jejich úplné názvy a cesty.

Poznámka:

Některá prostředí sestavení zpřístupní tajné kódy pomocí proměnných prostředí. Před sdílením binárního protokolu se ujistěte, že nezpřístupňuje tokeny rozhraní API ani jiné důležité tajné kódy.

Zachycení binárních protokolů pro sestavení příkazového řádku

Binární protokol můžete vytvořit předáním parametru -bl msBuild (MSBuild.exe nebo dotnet build). Obsah vygenerovaného .binlog souboru můžete prozkoumat pomocí prohlížeče strukturovaného protokolu MSBuild nebo v prohlížeči pomocí prohlížeče Live Structured Log Viewer. Nástroj MSBuild nezachytává žádná data z binárních protokolů zobrazených v prohlížeči.

Příklady

dotnet build -bl
dotnet build -bl:SpecificStep.binlog
MSBuild.exe -bl:ServiceRelease.binlog -p:Configuration=Release

Další podrobnosti o binárních protokolech

Zachycení binárních protokolů prostřednictvím sady Visual Studio

Zachycení protokolů pro všechna vyvolání nástroje MSBuild:

Nastavte MSBUILDDEBUGENGINE proměnnou prostředí na '1' existující cílovou složku a (volitelně) nastavte MSBUILDDEBUGPATH pro uložení zachycených protokolů. Potom spusťte Visual Studio ze stejného prostředí, abyste zdědili prostředí:

SET MSBUILDDEBUGENGINE=1
SET MSBUILDDEBUGPATH=C:\MSBuildReproLogs
devenv.exe MySolution.sln
$env:MSBUILDDEBUGENGINE = 1
$env:MSBUILDDEBUGPATH="C:\MSBuildReproLogs"
& "devenv.exe" MySolution.sln

Binární protokoly NÁSTROJE MSBuild se pak zaznamenávají do umístění určeného prostřednictvím MSBUILDDEBUGPATH proměnné prostředí (nebo se ve výchozím nastavení používá MSBuild_Logs podsložka aktuální složky nebo %temp%na základě přístupových práv).

Poznámka:

Protokoly se zaznamenávají pro každé vyvolání nástroje MSBuild (včetně sestavení času návrhu) a uchovávají se ve složce bez odebrání starších souborů, aby se počet souborů protokolu mohl rychle zvětšovat. Doporučuje se nastavit proměnnou prostředí opt-in pouze na krátkou dobu, po kterou se má problém prošetřit (i když je pochopitelné, že některé nedeterministické problémy můžou potřebovat více pokusů o reprodukci).

Vytvoření binárního protokolu MSBuild pomocí rozšíření Project System Tools

Projděte si tuto příručku v úložišti Nástrojů systému projektu pro zachycení binlogů prostřednictvím sady Visual Studio.

  1. Stáhněte a nainstalujte rozšíření Project System Tools.

  2. Po instalaci rozšíření se některé nové položky zobrazí v nabídce Zobrazit>ostatní okna.

    Other Windows menu

  3. Výběrem možnosti Zobrazit>jiné protokolování sestavení systému Windows>zobrazíte okno Protokolování sestavení v sadě Visual Studio. Výběrem první ikony panelu nástrojů zahájíte záznam běžných i návrhových buildů v systému projektu.

    Build logging window

  4. Po zaznamenání sestavení se zobrazí v okně Protokolování sestavení. Klikněte pravým tlačítkem myši na položku a v místní nabídce vyberte Uložit protokoly a uložte .binlog soubor.

    Build logging context menu

Soubory .binlog můžete vyhledat a zobrazit pomocí prohlížeče strukturovaných protokolů MSBuild.