使用BeforeTargets时,目标未运行=" Build"在Build Server上

时间:2015-01-16 14:28:54

标签: msbuild teamcity

我有一个自定义的.targets文件,我将其导入到我的C#MVC Web应用程序的项目文件中。我已经为此添加了自定义目标:

<Target Name="CopyFiles" BeforeTargets="Build"></Target>

这在Visual Studio下构建时工作正常,但是当我使用TeamCity构建它时,目标永远不会运行,我无法解决原因。

如果我将目标改为使用BeforeTargets =“Compile”,那么它就会运行。或者,如果我将名为Build的其他目标添加到.targets文件

<Target Name="Build" />

然后它将运行,但这样做会覆盖现有的Build目标,因此我的应用程序不会构建。我无法弄清楚这个逻辑 - 它没有意义。我现在正在使用Compile目标,但是如果有人可以解释为什么在Build任务不起作用之前尝试执行它我真的很感激。

1 个答案:

答案 0 :(得分:9)

&#39;生成&#39;是一个特殊的内置目标,因此与其他大多数目标的工作方式不同。它肯定无法安全地被覆盖。

最相关的文档在这里:https://msdn.microsoft.com/en-us/library/ms366724.aspx

如果你想在构建之前运行某些东西,标准方法(由新创建的.csproj文件中的注释推荐)是覆盖BeforeBuild目标(如上所述)。

但是,这不是最强大的解决方案。如上文所述:

  

覆盖预定义目标是扩展构建过程的简单方法,但是,由于MSBuild按顺序评估目标定义,因此无法阻止导入项目的其他项目覆盖已覆盖的目标。

更好(并且稍微复杂一点),覆盖BuildDependsOn属性并扩展此属性的默认值以包含您要运行的目标(这也在上面的链接中记录)。 / p>

另一种方法是将BeforeBuild保持为空并使用BeforeTargets="BeforeBuild",这感觉有点奇怪,但非常简单,即使OverBuild目标被覆盖,它仍然可以工作。

至于为什么BeforeTargets="Build"无效,我无法在文档中找到对此的参考,但我认为这与其特殊性质有关。它与普通目标的工作方式不同,最好不要将其视为目标。