Dela via


MSBuild-inkrementella versioner för nya eller inaktuella mål

När du skapar ett stort projekt är det viktigt att byggda mål som fortfarande är up-to-date inte återskapas. Om alla mål byggs varje gång kan det ta lång tid att färdigställa bygget.

I en inkrementell byggprocess är det bara de obygda målen för projektet eller inaktuella målen som byggs. Microsoft Build Engine (MSBuild) jämför tidsstämplarna för indatafilerna med tidsstämplarna för utdatafilerna. MSBuild avgör om du vill hoppa över, skapa eller delvis återskapa varje mål.

Den inkrementella byggprocessen kräver en en-till-en-mappning mellan indata och utdata för mål. Du kan använda transformeringar för att möjliggöra för mål att identifiera indata-till-output-mappningen. Mer information finns i Transformerar.

Ange indata och utdata

MSBuild kan skapa ett mål stegvis om indata och utdata i målet anges i projektfilen. Du anger värdena med attributen Inputs och Outputs i Target-elementet.

I följande exempel anges @(CSFile) objektlistan för Inputs filen och hello.exe för Outputs ett mål:

<Target Name="Build"
    Inputs="@(CSFile)"
    Outputs="hello.exe">
    ...
</Target>

MSBuild jämför tidsstämplarna för indata och utdata för målet. I det här exemplet, om någon fil i @(CSFile) objektlistan är nyare än filen hello.exe, bygger MSBuild målet; annars förbigås målet.

<Target Name="Build"
    Inputs="@(CSFile)"
    Outputs="hello.exe">

    <Csc
        Sources="@(CSFile)"
        OutputAssembly="hello.exe"/>
</Target>

Jämför en-till-en-mappning jämfört med ingen direkt mappning

När du anger indata och utdata i ett mål mappar antingen varje utdata till en indata direkt eller så finns det ingen direkt mappning mellan utdata och indata. I exemplet anger Csc-aktiviteten en utdatasammansättning som inte mappas till en enda indata. För den här uppgiften beror utdata på alla indata.

Här följer några överväganden om en-till-en-mappning jämfört med ingen direkt mappning:

  • Ett mål utan direkt mappning mellan indata och utdata skapas alltid oftare än ett mål där varje utdata mappas till en enda indata. Om ett mål inte har någon direkt mappning kan MSBuild inte fastställa de specifika utdata som ska återskapas när endast vissa indata ändras.

  • Uppgifter som kan identifiera en direkt mappning mellan utdata och indata är lämpligast för inkrementella versioner. Ett exempel är LC-aktivitet som genererar en .license-fil.

  • Uppgifter som skapar en enskild utdatasammansättning från flera indata är inte lämpliga för inkrementella versioner. Exempel är csc-aktiviteten som omsluter csc.exe-filen och genererar körbara filer, bibliotek och moduler samt Vbc-aktiviteten som omsluter vbc.exe-filen .

Använd transformationer för att skapa en en-till-en-mappning

I följande exempel definieras ett projekt som skapar innehållsfiler för ett hjälpsystem. Projektet fungerar genom att konvertera källfiler.txt till mellanliggande .content-filer , som kombineras med XML-metadatafiler för att skapa den slutliga .help-filen som används av systemet. Projektet innehåller följande uppgifter:

  • GenerateContentFiles: Konverterar .txt filer till .content-filer .
  • BuildHelp: Kombinerar .content-filer och XML-metadatafiler för att skapa den slutliga .help-filen .

Projektet använder transformeringar för att skapa en en-till-en-mappning mellan indata och utdata i GenerateContentFiles aktiviteten. Elementet Output är inställt på att automatiskt använda utdata från GenerateContentFiles aktiviteten som indata för BuildHelp aktiviteten.

Projektfilen innehåller Convert och Build mål. Aktiviteterna GenerateContentFiles och BuildHelp placeras i målen Convert respektive Build så att varje mål kan byggas inkrementellt. Elementdefinitionen Output placerar aktivitetens GenerateContentFiles utdata i ContentFile objektlistan, som ska användas som indata för BuildHelp aktiviteten. Den här metoden ger automatiskt utdata från en aktivitet som indata för en annan aktivitet. Du behöver inte visa en lista över enskilda objekt eller objektlistor manuellt i varje aktivitet.

Anmärkning

Även om målet Convert kan byggas inkrementellt krävs alltid alla utdata från det målet som indata för Build målet. MSBuild tillhandahåller automatiskt alla utdata från ett mål som indata för ett annat mål när du använder elementet Output .

<Project DefaultTargets="Build">

    <ItemGroup>
        <TXTFile Include="*.txt"/>
        <XMLFiles Include="\metadata\*.xml"/>
    </ItemGroup>

    <Target Name = "Convert"
        Inputs="@(TXTFile)"
        Outputs="@(TXTFile->'%(Filename).content')">

        <GenerateContentFiles
            Sources = "@(TXTFile)">
            <Output TaskParameter = "OutputContentFiles"
                ItemName = "ContentFiles"/>
        </GenerateContentFiles>
    </Target>

    <Target Name = "Build" DependsOnTargets = "Convert"
        Inputs="@(ContentFiles);@(XMLFiles)"
        Outputs="$(MSBuildProjectName).help">

        <BuildHelp
            ContentFiles = "@(ContentFiles)"
            MetadataFiles = "@(XMLFiles)"
            OutputFileName = "$(MSBuildProjectName).help"/>
    </Target>
</Project>