2009-08-26 9 views
9

Ho il seguente script di msbuild:Come richiamare lo stesso target msbuild due volte?

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

ho rimosso i corpi degli obiettivi per risparmiare spazio e perché sono irrilevanti. Tuttavia, se qualcuno pensa di essere, li includerò.

In ogni caso, come si può vedere, c'è un obiettivo - KillServerHosts, che desidero invocare due volte e per una buona ragione. Una volta prima della compilazione, al fine di garantire che nessun assembly sia bloccato e l'altra volta dopo il completamento dei test per "pulire la tabella".

Naturalmente, il tentativo di invocare il target KillServerHosts due volte non funziona, MSBuild si rifiuta di creare lo stesso target due volte. Quindi, sto cercando di imbrogliare invocando l'obiettivo KillServerHosts2. Il problema è che a volte funziona e altre volte no.

Se eseguo il target KillServerHosts dalla riga di comando, esso uccide sempre gli host del server rilevanti, quindi da questo punto di vista funziona correttamente.

Qualche idea?

risposta

22

In base alla progettazione Gli obiettivi di MSBuild non vengono eseguiti più di una volta. Non dovresti pensare a un target MSBuild come metodo o funzione, perché MSBuild non è un linguaggio di programmazione funzionale.

Se si desidera eseguire una destinazione più di una volta è possibile utilizzare l'attività MSBuild per farlo, basta passare in un diverso insieme di proprietà. Per esempio qualcosa di simile

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

Nota: non ho fatto provare questo modo ci potrebbero essere problemi di sintassi se I mis-scritte o ricordati in modo non corretto, ma si dovrebbe essere in grado di farlo funzionare.

+0

L'attributo deve essere "Progetti", non "Progetto". In questo modo il tuo suggerimento funziona perfettamente, grazie! –

+0

L'ho appena risolto. –

Problemi correlati