Condividi tramite


Procedura: eseguire la compilazione incrementale

Quando si compila un progetto di grandi dimensioni, è importante che i componenti creati in precedenza che risultano ancora aggiornati non vengano ricompilati. Se tutte le destinazioni venissero compilate ogni volta, il completamento delle singole compilazioni richiederebbe un tempo eccessivo. Per attivare le compilazioni incrementali, in cui vengono ricompilate solo le destinazioni non compilate in precedenza o le destinazioni non aggiornate, Microsoft Build Engine (MSBuild) può confrontare i timestamp dei file di input con i timestamp dei file di output e stabilire se ignorare, compilare o ricompilare parzialmente una destinazione. È tuttavia necessario che il mapping tra input e output sia di tipo uno-a-uno. Per consentire alle destinazioni di identificare questo mapping diretto, è possibile utilizzare le trasformazioni. Per ulteriori informazioni sulle trasformazioni, vedere Trasformazioni di MSBuild.

Specifica di input e output

Una destinazione può essere compilata in modo incrementale se input e output sono specificati nel file di progetto.

Per specificare input e output per una destinazione

  • Utilizzare gli attributi Inputs e Outputs dell'elemento Target. Ad esempio:

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

MSBuild può confrontare i timestamp dei file di input con i timestamp dei file di output e stabilire se ignorare, compilare o ricompilare parzialmente una destinazione. Nell'esempio riportato di seguito, se uno qualsiasi dei file dell'elenco di elementi @(CSFile) è più recente del file hello.exe, MSBuild eseguirà la destinazione. In caso contrario, questa verrà ignorata.

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

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

Quando in una destinazione vengono specificati input e output, ogni output potrà essere mappato a un solo input oppure non sarà possibile eseguire il mapping diretto tra output e input. Nell'attività Attività Csc precedente, ad esempio, non è possibile eseguire il mapping dell'output hello.exe ad alcun input singolo, ma l'output dipende da tutti gli input.

Nota

Le destinazioni in cui non si verifica il mapping diretto tra input e output verranno sempre compilate con maggiore frequenza rispetto a quelle in cui si esegue il mapping di ogni output a un solo input poiché MSBuild non è in grado di stabilire quale output debba essere ricompilato in caso di modifica di alcuni input.

Le attività in cui è possibile identificare un mapping diretto tra output e input, ad esempio l'attività Attività LC, sono più adatte alla compilazione incrementale, diversamente da attività quali Csc e Vbc, che producono un assembly di output da numerosi input.

Esempio

Nell'esempio riportato di seguito viene utilizzato un progetto che compila file della Guida per un ipotetico sistema di Guida. Il progetto prevede la conversione dei file txt di origine in file content intermedi, che vengono quindi combinati ai file di metadati XML per produrre il file finale con estensione help utilizzato dal sistema di Guida. Nel progetto vengono utilizzate le seguenti attività ipotetiche:

  • GenerateContentFiles: converte i file txt in file content.

  • BuildHelp: combina i file content e i file di metadati XML per compilare il file finale con estensione help.

Il progetto utilizza le trasformazioni per creare mapping uno-a-uno tra input e output nell'attività GenerateContentFiles. Per ulteriori informazioni, vedere Trasformazioni di MSBuild. L'elemento Output viene inoltre impostato in modo da utilizzare automaticamente gli output dell'attività GenerateContentFiles come input per l'attività BuildHelp.

Questo file di progetto contiene entrambe le destinazioni Convert e Build. Le attività GenerateContentFiles e BuildHelp vengono posizionate, rispettivamente, nelle destinazioni Convert e Build, in modo da consentire la compilazione incrementale delle singole destinazioni. Se si utilizza l'elemento Output, gli output dell'attività GenerateContentFiles vengono posizionati nell'elenco di elementi ContentFile, in cui possono essere utilizzati come input per l'attività BuildHelp. Questa applicazione dell'elemento Output consente di utilizzare automaticamente gli output di un'attività come input per un'altra attività, senza dover elencare manualmente i singoli elementi o elenchi di elementi in ogni attività.

Nota

Sebbene la destinazione GenerateContentFiles possa essere compilata in modo incrementale, tutti gli output di tale destinazione sono sempre necessari come input per la destinazione BuildHelp.MSBuild fornisce automaticamente tutti gli output di una destinazione come input per un'altra destinazione quando si utilizza l'elemento Output.

<Project DefaultTargets="Build"
    xmlns="https://schemas.microsoft.com/developer/msbuild/2003" >

    <ItemGroup>
        <TXTFile Include="*.txt"/>
        <XMLFile 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 = "@(XMLFile)"
            OutputFileName = "$(MSBuildProjectName).help"/>
    </Target>
</Project>

Vedere anche

Riferimenti

Elemento Target (MSBuild)

Attività Csc

Attività Vbc

Concetti

Destinazioni di MSBuild

Trasformazioni di MSBuild