Delen via


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 in false. 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 TaskParameterValueSetByTaskis. 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.