2009-08-26 16 views
9

Mam następujący skrypt msbuild:Jak dwukrotnie wywołać ten sam cel msbuild?

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

usunąłem ciał celów, aby zaoszczędzić miejsce i dlatego są one nieistotne. Jeśli jednak ktoś myśli, że tak, to ja je uwzględnię.

W każdym razie, jak widać, jest jeden cel - KillServerHosts, który chcę przywołać dwa razy i nie bez powodu. Raz przed kompilacją, aby upewnić się, że żadne zespoły nie są zablokowane, a drugi czas po zakończeniu testów należy "wyczyścić tabelę".

Oczywiście, próba dwukrotnego wywołania celu KillServerHosts nie działa, MSBuild odmawia dwukrotnego zbudowania tego samego celu. Tak więc próbuję oszukać, wywołując cel KillServerHosts2. Problem polega na tym, że czasami działa, a czasami nie.

Jeśli uruchomię cel KillServerHosts z wiersza poleceń, zabije on zawsze odpowiednie hosty serwera, więc pod tym względem działa dobrze.

Wszelkie pomysły?

Odpowiedz

22

Według projektu cele MSBuild nie są wykonywane więcej niż jeden raz. Nie powinieneś myśleć o celu MSBuild jako metodzie lub funkcji, bucause MSBuild nie jest funkcjonalnym językiem programowania.

Jeśli chcesz wykonać cel więcej niż jeden raz, możesz użyć zadania MSBuild, aby to zrobić, wystarczy przekazać inny zestaw właściwości. Na przykład coś takiego

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

Uwaga: Nie faktycznie to wypróbować, więc nie mogą być problemy składniowe Gdybym mis-orkisz lub nieprawidłowo pamiętał, ale powinieneś być w stanie uzyskać jego pracy.

+0

Atrybut powinien być "Projekty", a nie "Projekt". W ten sposób Twoja sugestia działa idealnie, dzięki! –

+0

Właśnie naprawiłem to. –

Powiązane problemy