2012-12-20 2 views
5

Ich habe eine MSBuild-Datei, die * / .SLN-Dateien erstellt (erstellt alle .SLN-Dateien, die vorhanden sind).Führen Sie ein MSBuild-Ziel nur, wenn das Projekt tatsächlich erstellt wird

Der Build verwendet das Build Ziel. Wenn also keine Änderungen an den Eingabedateien vorgenommen wurden, sollte kein Projekt erneut erstellt werden.

Ich möchte einige benutzerdefinierte Ziel nur ausführen, wenn ein Projekt tatsächlich wieder aufgebaut wird.

Wie kann das gemacht werden?

Sowohl Afterbuild und AfterCompile sind immer aufgerufen, unabhängig davon, ob die Kompilierung/bauen tatsächlich stattfindet.

+0

ist dieses Ziel in jeder Projektdatei oder ist es in einer separaten Projektdatei, die auch zur Lösung gehört? – stijn

+0

Separate Projektdatei –

+0

, die etwas härter scheint .. wollen Sie auch das Ziel gebaut, wenn ein anderes Projekt gebaut wurde oder wenn alle Projekte gebaut wurden, oder ...? – stijn

Antwort

5

Grundsätzlich möchten Sie das gleiche Verhalten wie die PostBuildEvent zum Beispiel, so dass ich sah, wie Microsoft.Common.Targets tut es (diese Datei immer einen schönen Einblick bietet in, wie msbuild soll verwendet werden). Hier ist die Lösung:

<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> 

Und das ist, was geht weiter: wenn es eine Eigenschaft mit dem Namen ist RunPostBuildEvent mit einem Wert von OnOutputUpdated das CoreBuild Ziel dependncies schließlich den Zeitstempel der Ausgabedatei aufgezeichnet vor und nach dem Build. Und wenn sie gleich sind, wurde die Ausgabe nicht erstellt. Alles, was übrig bleibt, ist, dass Ihr Ziel nach CoreBuild läuft und diese Zeitstempel überprüft werden.

+0

Scheint ungefähr richtig. Ich werde das überprüfen! danke –

+0

Ist das Element hier obligatorisch? –

+0

Ja, es ist der Standard-Import (erforderlich für C#) am Ende jeder csproj-Datei. Ohne sie können Sie nicht (einfach) C# -Anwendungen erstellen – stijn

Verwandte Themen