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

11

我有以下的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目标,它总是杀死相关的服务器主机,因此从这个方面来看它工作正常。

有任何想法吗?

1个回答

24

根据设计,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”。这样你的建议就完美地实现了,谢谢! - Sergii Volchkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接