visual studio orden compilacion msbuild target targets

studio - ¿Cómo invocar el mismo objetivo de msbuild dos veces?



msbuild properties (1)

Tengo el siguiente script de 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>

He eliminado 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 construir el mismo objetivo 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 destino KillServerHosts desde la línea de comandos siempre mata los servidores de servidor relevantes, por lo que desde este punto de vista funciona bien.

¿Algunas ideas?


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 usar la tarea MSBuild para hacerlo, simplemente transfiera 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: En realidad, no probé esto, por lo que podría haber problemas de sintaxis si escribí mal o recuerdo incorrectamente, pero debería poder ponerlo en funcionamiento.