2012-12-20 11 views
5

Ho un file MSBuild che crea * / .sln files (crea tutti i file .sln esistenti).Esegui una destinazione MSBuild solo se il progetto è effettivamente realizzato

La build utilizza la destinazione Build, quindi se non sono state apportate modifiche ai file di input, nessun progetto deve essere ricostruito.

Vorrei eseguire un obiettivo personalizzato solo se un progetto viene effettivamente ricostruito.

Come si può fare?

Sia AfterBuild e AfterCompile sono sempre chiamato, non importa se la compilazione/costruire realmente avviene.

+0

è l'obiettivo in ogni file di progetto o si trova in un file projet separato che appartiene anche alla soluzione? – stijn

+0

Il file di progetto separato –

+0

sembra un po 'più difficile .. inoltre, vuoi che il target sia costruito quando è stato costruito un altro progetto o quando sono stati costruiti tutti i progetti o ...? – stijn

risposta

5

In sostanza si vuole lo stesso comportamento come il PostBuildEvent per esempio, così ho guardato come Microsoft.Common.Targets lo fa (questo file sempre offre una bella panoramica della MSBuild come dovrebbe essere usato). Ecco la soluzione:

<PropertyGroup> 
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent> 
</PropertyGroup> 
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> 
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"  
     Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'"> 
    <Message Importance="high" Text="RunWhenBuild!!"/> 
</Target> 

E questo è ciò che accade: quando c'è una proprietà denominata RunPostBuildEvent con un valore di OnOutputUpdated dependncies del CoreBuild del bersaglio alla fine registrano il timestamp del file di output prima e dopo la compilazione. E se sono uguali, l'output non è stato costruito. Quindi tutto ciò che rimane è ottenere il tuo obiettivo di correre dopo CoreBuild e controllare questi timestamp.

+0

Sembra giusto. Controllerò questo! grazie –

+0

L'elemento è obbligatorio qui? –

+0

sì, è l'importazione standard (richiesta per C#) vicino alla fine di ogni file csproj. Senza di esso non è possibile (facilmente) creare applicazioni C# – stijn

Problemi correlati