我的构建中有一个自定义目标(一组复制任务),我需要调用几次以在不同的地方进行更改。但是,这仅在第一次调用时运行,之后TFS构建会跳过所述目标。
该过程如下:
<!-- Copy some files to another location -->
<CallTarget Targets="CopyFiles"></CallTarget>
...
<!-- Copy the above files to yet another location -->
<CallTarget Targets="CopyFiles"></CallTarget>
在构建日志中,可以看到第二次调用目标“CopyFiles”时跳过:
Target "CopyLicenseManagerFiles" skipped. Previously built successfully.
为什么会这样?有没有办法强制目标(或我写的任何自定义目标)多次运行?
答案 0 :(得分:4)
这是设计的。目标不应被视为“方法”。 MSBuild更具说明性。因此,它会跟踪已执行的目标,并有目的地跳过已经完成的目标。
答案 1 :(得分:3)
每个参数集应该为每个MSBuild实例调用一次。在某些情况下,Team Build会分离出MSBuild的单独实例(例如,如果您提供多个解决方案配置)。但这可能对你没有帮助。
更适用于您的场景,如果您使用不同的参数集调用任务,MSBuild将重新运行任务。如果您要复制两组不同的文件,听起来就像您正在寻找的功能。
<MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=1" />
<!-- .... -->
<MSBuild Project=".\CommonStuff.targets" Targets="CopyFiles" Properties="Location=2" />
另一个解决方案是将功能重构为Task而不是Target。虽然仍然存在声明性和程序性的怪癖,但是任务与更熟悉的语言中的“功能”更接近。