2010-11-26 8 views
4

Ich habe ein MSBuild-Skript, das einfach alles tut, was ich tun muss, abgesehen von meinem Post-Build-Schritt (siehe eine vorherige Frage, die ich fragte: MSBuild conditional Exec?).MSBuild Post-Build

Ich möchte viele csproj-Dateien erstellen und optional Post-Build-Schritte ausführen, wenn und nur wenn das Projekt erstellt wurde. Ich möchte meinen Post-Build-Schritt nicht ständig ausführen, sonst wird der Zeitstempel meiner endgültigen Ausgabe unnötigerweise geändert (und der Build-Prozess ohne Grund sehr zeitraubend).

<Target Name="ProjectName"> 
    <MSBuild Projects="PathToProject" Properties="Configuration=$(buildtype)" /> 
</Target> 

Edit:: Ich denke, was, wenn die Aufgabe ausgeführt CoreCompile ich möchte wirklich erkennen

In meinem MSBuild-Skript Ich habe für jedes meiner csproj Dateien so etwas wie die folgenden bekam für jedes Projekt. Wenn es einen Weg gäbe, dies in einem Zustand zu überprüfen?

Irgendwelche Ideen?

Ich bin neu bei MSBuild, also bin ich vielleicht auf dem falschen Weg!

Danke, Alan

Antwort

1

Nach viel für eine einfache Lösung für dieses Problem gesucht ich nicht fündig wird und endete mit einer Lösung aus meinem eigenen kommen, das funktioniert aber möglicherweise nicht die beste Lösung sein. Allerdings wollte ich es mit anderen teilen, die das gleiche Problem haben, so dass Sie zumindest eine funktionierende Lösung haben und Ihnen hoffentlich viel Kopfschütteln sparen können.

Um zu wiederholen, was ich tun wollte, war ein Befehlszeilentool, nachdem mein Projekt erstellt wurde, aber nur wenn die Assembly aktualisiert wurde (d. H. Der Zeitstempel geändert). Ich wollte das nicht in den Post-Build-Bereich eines jeden Projekts schreiben, da ich nur wollte, dass der Post-Build auf unserem Build-Server (nicht auf Entwicklungsmaschinen) stattfindet.

Ich habe keine Möglichkeit gefunden, dies extern in meiner Hauptdatei .proj zu tun und änderte letztendlich den Post-Build-Abschnitt jeder .csproj-Datei. Allerdings habe ich voran es mit einer if Bedingung etwas wie folgt aus:

if '$(ExecuteCommand)' == 'true' command.exe 

Dies bedeutet, dass der Befehl nicht auf dem Entwicklungscomputer ausgeführt werden, aber wenn ich den Build von meiner .proj Datei aufrufen kann ich dieses Flag auf wahr wie folgt aus:

<!-- Define common properties --> 
<PropertyGroup> 
    <ExecuteCommand>true</ExecuteCommand> 
</PropertyGroup> 

<Target Name="YourTarget"> 
    <!-- Build project --> 
    <MSBuild Projects="Path to project" Properties="ExecuteCommand=$(ExecuteCommand)" /> 
</Target> 

wie gesagt, ich glaube nicht, dass die anmutigsten Lösung ist, aber es funktioniert sicher und wird für den Augenblick für mich ausreichend. Allerdings wäre ich immer noch interessiert zu hören, was der richtige Weg ist, dies zu erreichen, damit ich mein Skript verbessern kann.

Danke, Alan

2

Sie können es auf die Konfiguration in Ihrem Build-Prozess ausgewählt auch tun basiert.

<Target Name="DoStuffWithNewlyCompiledAssembly"> 
    <Exec Command="command.exe" /> 
</Target> 

...: Für CI, sollten Sie immer verwenden „Release“ oder „Produktion“

<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/> 
0

Wenn Sie die folgenden Funktionen jedes Ihrer Projekte hinzufügen können (Sie können Ihre eigenen definieren)dann brauchen Sie nur eine Eigenschaft hinzuzufügen:

<Target Name="Name"> 
    <MSBuild Projects="" Properties="TargetsTriggeredByCompilation=DoStuffWithNewlyCompiledAssembly" /> 
</Target> 

Dies funktioniert, weil jemand intelligent bei Microsoft die folgende Zeile am Ende des CoreCompile Ziel in Microsoft.[CSharp|VisualBasic][.Core].targets (der Dateiname auf die Sprache und MSBuild/Visual Studio Version hängt hinzugefügt).

<CallTarget Targets="$(TargetsTriggeredByCompilation)" Condition="'$(TargetsTriggeredByCompilation)' != ''"/> 

Also, wenn Sie einen Zielnamen in der TargetsTriggeredByCompilation Eigenschaft angeben, wird Ihr Ziel ausgeführt werden, wenn CoreCompile runs-- und Ihr Ziel wird nicht ausgeführt, wenn CoreCompile übersprungen wird (zB weil die Ausgabebaugruppe ist bereits up-to Datum in Bezug auf den Code).