Ř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:
Otevřete příkazový řádek pro vývojáře sady Visual Studio, který odpovídá vaší verzi sady Visual Studio.
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
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í.>
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í.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.
Stáhněte a nainstalujte rozšíření Project System Tools.
Po instalaci rozšíření se některé nové položky zobrazí v nabídce Zobrazit>ostatní okna.
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.
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.
Soubory .binlog můžete vyhledat a zobrazit pomocí prohlížeče strukturovaných protokolů MSBuild.