【问题标题】:Custom targets are skipped after first run in TFS build在 TFS 构建中首次运行后跳过自定义目标
【发布时间】:2010-11-27 16:11:08
【问题描述】:

我的构建中有一个自定义目标(一组复制任务等),我需要调用几次才能在不同位置进行更改。但是,这只在第一次调用时运行,之后 TFS 构建会跳过所述目标。

流程如下:

<!-- Copy some files to another location -->
<CallTarget Targets="CopyFiles"></CallTarget>

...

<!-- Copy the above files to yet another location -->
<CallTarget Targets="CopyFiles"></CallTarget>

在构建日志中,可以看到目标“CopyFiles”在第二次被调用时被跳过:

已跳过目标“CopyLicenseManagerFiles”。以前构建成功。

为什么会这样?有没有办法强制目标(或我编写的任何自定义目标)运行多次?

【问题讨论】:

    标签: tfs msbuild msbuild-task tfsbuild


    【解决方案1】:

    这是设计使然。目标不应被视为“方法”。 MSBuild 更具声明性。因此,它会跟踪已执行的目标,并有意跳过已完成的目标。

    【讨论】:

      【解决方案2】:

      应该为每个 MSBuild 实例、每个参数集调用一次。在某些情况下(例如,如果您提供多个解决方案配置),Team Build 会分离出单独的 MSBuild 实例。但这可能对您没有帮助。

      更适用于您的场景,如果您使用一组不同的参数调用 MSBuild,它将重新运行任务。如果您要复制两组不同的文件,这听起来像是您正在寻找的功能。

      <MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=1" />
      <!--  ....  -->
      <MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=2" />
      

      另一种解决方案是将功能重构为任务而不是目标。虽然仍然存在声明性与程序性的怪癖,但 Tasks 的行为更接近于您所认为的更熟悉的语言中的“函数”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多