如何调用同一msbuild目标两次?

如何调用同一msbuild目标两次?,msbuild,target,targets,Msbuild,Target,Targets,我有以下msbuild脚本: <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="All"> <PropertyGroup> ... </PropertyGroup> <UsingTask AssemblyFil

我有以下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>

...
...
...
...
...
...
...
...
...
我已经移除了目标的尸体以节省空间,因为它们是无关的。然而,如果有人认为他们是,我会包括他们

无论如何,正如大家所看到的,有一个目标-
KillServerHosts
,我希望调用它两次,这是有充分理由的。一次在生成之前,为了确保没有程序集被锁定,另一次在测试完成后“清理表”

当然,尝试两次调用目标
KillServerHosts
是不起作用的,MSBuild拒绝两次构建同一目标。因此,我试图通过调用目标
KillServerHosts2
进行欺骗。问题是它有时有效,有时无效

如果我从命令行运行
KillServerHosts
目标,它总是会杀死相关的服务器主机,因此从这方面来说,它工作得很好


有什么想法吗?

按设计MSBuild目标不会执行多次。您不应将MSBuild目标视为方法或函数,因为MSBuild不是函数式编程语言

如果要多次执行目标,可以使用MSBuild任务执行,只需传入一组不同的属性即可。举个例子

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


注意:我实际上没有尝试过这个方法,因此如果我拼写错误或记忆错误,可能会出现语法问题,但您应该能够让它正常工作。

属性应该是“Projects”,而不是“Project”。这样你的建议就完美了,谢谢!