2009-08-26 9 views
9

que tienen la siguiente secuencia de comandos msbuild:¿Cómo invocar el mismo objetivo de msbuild dos veces?

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

He quitado los cuerpos de los objetivos para ahorrar espacio y porque son irrelevantes. Sin embargo, si alguien piensa que lo son, los incluiré.

De todos modos, como se puede ver, hay un objetivo - KillServerHosts, que deseo invocar dos veces y por una buena razón. Una vez antes de la compilación, para garantizar que ningún ensamblaje esté bloqueado y el otro tiempo después de completar las pruebas para "limpiar la mesa".

Naturalmente, intentar invocar el objetivo KillServerHosts dos veces no funciona, MSBuild se niega a generar el mismo destino dos veces. Por lo tanto, estoy tratando de hacer trampa invocando el objetivo KillServerHosts2. El problema es que a veces funciona y otras no.

Si ejecuto el objetivo KillServerHosts desde la línea de comandos siempre mata los hosts del servidor correspondientes, por lo que desde este punto de vista funciona bien.

¿Alguna idea?

Respuesta

22

Por diseño, los objetivos de MSBuild no se ejecutan más de una vez. No debe pensar en un objetivo de MSBuild como método o función, ya que MSBuild no es un lenguaje de programación funcional.

Si desea ejecutar un objetivo más de una vez puede utilizar la tarea MSBuild para hacerlo, simplemente pase un conjunto diferente de propiedades. Por ejemplo algo como esto

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

Nota: Yo en realidad no probar esto por lo que puede haber problemas de sintaxis si yo mal escritas o recordados de forma incorrecta, sino que debe ser capaz de hacerlo funcionar.

+0

El atributo debe ser 'Proyectos', no 'Proyecto'. De esa forma tu sugerencia funciona perfectamente, ¡gracias! –

+0

Lo acabo de arreglar. –

Cuestiones relacionadas