【问题标题】:How to invoke the same msbuild target twice?如何两次调用相同的 msbuild 目标?
【发布时间】:2009-08-26 06:37:47
【问题描述】:

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


    【解决方案1】:

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

    如果您想多次执行一个目标,您可以使用 MSBuild 任务来执行此操作,只需传入一组不同的属性。比如这样的

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

    注意:我实际上并没有尝试过,所以如果我拼写错误或记忆不正确,可能会出现语法问题,但你应该能够让它工作。

    【讨论】:

    • 属性应该是“项目”,而不是“项目”。这样你的建议就完美了,谢谢!
    猜你喜欢
    • 2010-11-20
    • 2013-10-21
    • 2023-03-30
    • 1970-01-01
    • 2010-10-25
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多