Frage

habe ich bekomme einen MSBuild-Skript, das gerade über alles tut, ist, dass ich es brauche auseinander zu tun aus meinem Post-Build-Schritt (eine vorherige Frage, dass ich gefragt: MSBuild bedingte Exec? ).

Was ich suche, ist, viele csproj Dateien Build zu tun und optional ausführen Post-Build-Schritte, wenn und nur wenn das Projekt gebaut wurde. Ich will nicht meine Post-Build-Schritt die ganze Zeit oder auch den Zeitstempel auf meiner letzten Ausgabe unnötig geändert werden auszuführen (und es macht den Build-Prozess sehr zeitaufwendig ohne Grund).

In meinem MSBuild-Skript Ich habe für jedes meiner csproj Dateien so etwas wie die folgenden bekommen:

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

Edit: Ich denke, was ich wirklich tun will erkennen ist, wenn die CoreCompile Task ausgeführt wird für jedes Projekt. Wenn es eine Möglichkeit, dies in einem Zustand zu überprüfen war?

Irgendwelche Ideen?

Ich bin neu in MSBuild so vielleicht bin ich auf völlig falsche Weg!

Danke, Alan

War es hilfreich?

Lösung 2

Nach langer Suche für eine einfache Lösung für dieses Problem, das ich nicht finden war 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 niemandem teilen andere, die das gleiche Problem hat, so dass Sie zumindest eine funktionierende Lösung haben kann und hoffentlich Ihnen viel Kopf hämmern zu speichern.

Zur Erinnerung, was ich ein Kommandozeilen-Tool ausgeführt wurde tun wollte nach meinem Projekt gebaut wurde, aber nur, wenn die Baugruppe aktualisiert wurde (das heißt der Zeitstempel geändert). Ich wollte nicht von jedem Projekt diesen in den Post-Build-Abschnitt setzen, weil ich nur den Post-Build passiert auf unserem Build-Server (nicht Entwicklungsmaschinen) wollte.

Ich fand keine Möglichkeit, dies zu tun, von außen in meinem Haupt .proj Datei und habe Änderung am Ende des Post-Build-Abschnitts jeder CSPROJ Datei. Allerdings habe ich voran es mit einem, wenn die Bedingung so etwas wie folgt aus:

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

Das bedeutet, dass der Befehl nicht auf dem Entwicklungscomputer ausgeführt werden, aber wenn ich invoke den Build von meiner Proj-Datei kann ich diesen Flag auf true wie folgt festgelegt:

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

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

, sagte Wie ich, ich glaube nicht, dass die anmutigsten Lösung ist, aber es funktioniert sicher und wird für mich vorerst ausreichen. Allerdings würde ich immer noch daran interessiert zu hören, was der richtige Weg, dies zu erreichen, ist so, dass ich mein Skript zu verbessern.

Danke, Alan

Andere Tipps

Sie können es auch auf die in Ihrem Build-Prozess ausgewählte Konfiguration tun basiert. verwenden „Release“ oder „Produktion“

Für CI, sollten Sie immer (Sie Ihre eigenen können festlegen)
<Exec Condition="'$(ConfigurationName)'=='Release'" Command="your command goes here ..."/>

Wenn Sie jedes Ihrer Projekte können folgende hinzufügen:

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

... dann brauchen Sie nur eine Eigenschaft hinzuzufügen:

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

Das funktioniert, weil jemand intelligent bei Microsoft die folgenden Zeile am Ende des CoreCompile Ziels in Microsoft.[CSharp|VisualBasic][.Core].targets (der Dateinamen auf der Sprache und MSBuild / Visual Studio-Version abhängig) hinzugefügt.

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

Wenn Sie also einen Zielnamen in der TargetsTriggeredByCompilation Eigenschaft angeben, Ihr Ziel wird ausgeführt, wenn CoreCompile runs-- und Ihr Ziel wird nicht ausgeführt, wenn CoreCompile übersprungen wird (zB weil der Ausgang ist die Montage bereits auf dem neuesten Stand in Bezug auf der Code).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top