Incrementele compilaties
Incrementele MSBuild-builds zijn builds die zijn geoptimaliseerd, zodat doelen met uitvoerbestanden die up-to-date zijn met betrekking tot de bijbehorende invoerbestanden niet worden uitgevoerd.
Een doelelement kan zowel een Inputs
kenmerk hebben, wat aangeeft welke items het doel verwacht als invoer, en een Outputs
kenmerk, wat aangeeft welke items het produceert als uitvoer. MSBuild probeert een een-op-een-toewijzing te vinden tussen de waarden van deze kenmerken. Als een dergelijke toewijzing bestaat, vergelijkt MSBuild het tijdstempel van elk invoeritem met het tijdstempel van het bijbehorende uitvoeritem. Uitvoerbestanden die geen een-op-een-toewijzing hebben, worden vergeleken met alle invoerbestanden. Een item wordt beschouwd als up-to-datum als het uitvoerbestand dezelfde leeftijd of nieuwer is dan het invoerbestand of de bijbehorende invoerbestanden.
Notitie
Wanneer MSBuild de invoerbestanden evalueert, wordt alleen de inhoud van de lijst in de huidige uitvoering overwogen. Wijzigingen in de lijst van de laatste build maken niet automatisch een doel verouderd.
Als alle uitvoeritems up-to-date zijn, slaat MSBuild het doel over. Dit incrementele versie van het doelwit kan de buildsnelheid aanzienlijk verbeteren. Als er slechts enkele bestanden zijn up-to-date, voert MSBuild het doel uit, maar slaat de up-to-datumitems over en brengt daarom alle items up-to-date. Dit proces wordt een gedeeltelijke incrementele buildgenoemd.
Een-op-een-toewijzingen kunnen alleen worden geproduceerd door het kenmerk Outputs
te transformeren met het kenmerk Inputs
. Zie MSBuild transformsvoor meer informatie.
Houd rekening met het volgende doel:
<Target Name="Backup" Inputs="@(Compile)"
Outputs="@(Compile->'$(BackupFolder)%(Identity).bak')">
<Copy SourceFiles="@(Compile)" DestinationFiles=
"@(Compile->'$(BackupFolder)%(Identity).bak')" />
</Target>
De set bestanden die worden vertegenwoordigd door het itemtype Compile
wordt gekopieerd naar een back-upmap. De back-upbestanden hebben de .bak
bestandsnaamextensie. Als de bestanden die worden vertegenwoordigd door het itemtype Compile
of de bijbehorende back-upbestanden, niet worden verwijderd of gewijzigd nadat het Backup
doel is uitgevoerd, wordt het Backup
doel overgeslagen in volgende builds.
Uitvoerdeductie
MSBuild vergelijkt de kenmerken Inputs
en Outputs
van een doel om te bepalen of het doel moet worden uitgevoerd. In het ideale geval moet de set bestanden die bestaan nadat een incrementele build is voltooid, hetzelfde blijven, ongeacht of de bijbehorende doelen worden uitgevoerd. Omdat eigenschappen en items die taken maken of wijzigen van invloed kunnen zijn op de build, moet MSBuild hun waarden afleiden, zelfs als het doel dat erop van invloed is, wordt overgeslagen. Dit proces staat bekend als uitvoerdeductie.
Er zijn drie gevallen:
Het doel heeft een
Condition
kenmerk dat resulteert infalse
. In dit geval wordt het doel niet uitgevoerd en heeft dit geen effect op de build.Het doel heeft verouderde uitvoer en wordt uitgevoerd om ze up-to-date te brengen.
Het doel heeft geen verouderde uitvoer en wordt overgeslagen. MSBuild evalueert het doel en brengt wijzigingen aan in items en eigenschappen alsof het doel is uitgevoerd.
Ter ondersteuning van incrementele compilatie moeten taken ervoor zorgen dat de TaskParameter
kenmerkwaarde van een Output
element gelijk is aan een taakinvoerparameter. Bijvoorbeeld:
<CreateProperty Value="123">
<Output PropertyName="Easy" TaskParameter="Value" />
</CreateProperty>
Met deze code maakt u de eigenschap Easy
, met de waarde 123
, ongeacht of dat doel wordt uitgevoerd of overgeslagen.
Vanaf MSBuild 3.5 wordt uitvoerdeductie automatisch uitgevoerd op item- en eigenschapsgroepen in een doel.
CreateItem
taken zijn niet vereist in een doel en moeten worden vermeden.
CreateProperty
taken moeten ook alleen in een doel worden gebruikt om te bepalen of een doel is uitgevoerd.
Voordat MSBuild 3.5, kunt u de taak CreateItem gebruiken.
Bepalen of een target wordt uitgevoerd
Vanwege uitvoerdeductie moet u de eigenschappen en items van een doel onderzoeken om te bepalen of het doel is uitgevoerd. Voeg hiervoor de CreateProperty
taak toe aan het doel en geef het vervolgens een Output
element waarvan de TaskParameter
ValueSetByTask
is. Bijvoorbeeld:
<CreateProperty Value="true">
<Output TaskParameter="ValueSetByTask" PropertyName="CompileRan" />
</CreateProperty>
Deze code maakt de eigenschap CompileRan
en geeft deze de waarde true
, maar alleen als het doel wordt uitgevoerd. Als het doel wordt overgeslagen, wordt CompileRan
niet gemaakt.