2009-08-26 7 views
9

Ich habe folgendes msbuild Skript:Wie die gleiche msbuild Ziel zweimal aufzurufen?

<?xml version="1.0" encoding="utf-8"?> 
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 
     DefaultTargets="All"> 

    <PropertyGroup> 
    ... 
    </PropertyGroup> 

    <UsingTask AssemblyFile="$(GallioTaskPath)" TaskName="Gallio.MSBuildTasks.Gallio" /> 
    <Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.Targets" /> 

    <ItemGroup> 
    ... 
    </ItemGroup> 

    <Target Name="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="RunServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts" DependsOnTargets="CheckServerHostsItemGroup" 
      Condition="'$(NoServerHosts)' != True"> 
    ... 
    </Target> 

    <Target Name="KillServerHosts2" 
      Condition="'$(NoServerHosts)' != True"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="KillServerHosts" Properties="Configuration=$(Configuration)" /> 
    </Target> 

    <Target Name="All" DependsOnTargets="Build;RunServerHosts;Test;KillServerHosts2"> 
    <OnError ExecuteTargets="KillServerHosts2" /> 
    </Target> 

    <Target Name="Test"> 
    ... 
    <Error Text="Tests execution failed with exit code $(ExitCode)" Condition="'$(ExitCode)' != 0" /> 
    </Target> 

    <Target Name="CheckSolutionsItemGroup"> 
    ... 
    </Target> 

    <Target Name="Build" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

    <Target Name="Clean" DependsOnTargets="CheckSolutionsItemGroup;KillServerHosts"> 
    ... 
    </Target> 

</Project> 

ich die Leichen der Ziele entfernt um Platz zu sparen und weil sie nicht relevant sind. Wenn jemand jedoch denkt, dass sie es sind, werde ich sie einschließen.

Wie auch immer, wie man sehen kann, ist es ein Ziel - KillServerHosts, das wünsche ich zweimal und für einen guten Grund berufen. Einmal vor dem Build, um keine Versammlungen, um sicherzustellen, sind gesperrt und das andere Mal nach den Tests abgeschlossen „Bereinigung der Tabelle“.

natürlich versuchen, das Ziel zu berufen KillServerHosts zweimal nicht funktioniert, MSBuild weigert zweimal das gleiche Ziel zu bauen. Also versuche ich zu betrügen, indem ich das Ziel KillServerHosts2 anrufe. Das Problem ist, dass es manchmal funktioniert und manchmal nicht.

Wenn ich das KillServerHosts Ziel von der Kommandozeile aus ausführen, tötet es immer die relevanten Server-Hosts, von daher funktioniert es gut.

Irgendwelche Ideen?

Antwort

22

Durch Design MSBuild Ziele werden nicht mehr als einmal ausgeführt. Sie sollten nicht denken Sie an einem MSBuild Ziel als eine Methode oder Funktion, bucause MSBuild keine funktionale Programmiersprache ist.

Wenn Sie ein Ziel mehr als einmal ausführen möchten, können Sie die MSBuild-Aufgabe dazu verwenden, indem Sie einfach eine andere Gruppe von Eigenschaften übergeben. Zum Beispiel so etwas wie dieser

<Target Name="SomeTarget"> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=one" /> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="YourTarget" Properties="FakeProperty=two" /> 
</Target> 

Hinweis: ich dies eigentlich nicht versuchen, so könnte es Syntax Probleme, wenn ich falsch geschrieben oder falsch in Erinnerung, aber Sie sollten es zum Laufen bringen können.

+0

Das Attribut sollte "Projekte" sein, nicht "Projekt". So funktioniert dein Vorschlag perfekt, danke! –

+0

Ich habe es gerade behoben. –