在构建服务器上使用 BeforeTargets="Build" 时目标不是 运行

Target not running when using BeforeTargets="Build" on Build Server

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

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

这在 Visual Studio 下构建时工作正常,但当我使用 TeamCity 构建它时,目标永远不会 运行,我无法弄清楚为什么。

如果我将目标更改为使用 BeforeTargets="Compile",那么它 运行s。或者,如果我将名称为 Build 的附加目标添加到 .targets 文件

<Target Name="Build" />

然后它将 运行,但这样做会覆盖现有的构建目标,因此我的应用程序不会构建。我不太明白其中的逻辑——这没有意义。我现在正在使用 Compile 目标,但如果有人能解释为什么在 Build 任务不起作用之前尝试执行它,我将不胜感激。

'Build' 是一个特殊的内置目标,因此与大多数其他目标的工作方式不同。它绝对不能被安全地覆盖。

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

如果您想要在构建之前 运行 执行某些操作,标准方法(如新创建的 .csproj 文件中的注释所推荐的那样)是覆盖 BeforeBuild 目标(如上文所述)。

但是,这不是最可靠的解决方案。如上面的文档所述:

Overriding predefined targets is an easy way to extend the build process, but, because MSBuild evaluates the definition of targets sequentially, there is no way to prevent another project that imports your project from overriding the targets you already have overridden.

覆盖 BuildDependsOn 属性 并扩展此 属性 的默认值以包含您想要 运行 的目标(此也记录在上面的 link 中。

另一种方法是将 BeforeBuild 留空并使用 BeforeTargets="BeforeBuild",这感觉有点奇怪但非常简单,即使 BeforeBuild 目标被覆盖也仍然有效。

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