我有一个自定义的.targets文件,我将其导入到我的C#MVC Web应用程序的项目文件中。我已经为此添加了自定义目标:
<Target Name="CopyFiles" BeforeTargets="Build"></Target>
这在Visual Studio下构建时工作正常,但是当我使用TeamCity构建它时,目标永远不会运行,我无法解决原因。
如果我将目标改为使用BeforeTargets =“Compile”,那么它就会运行。或者,如果我将名为Build的其他目标添加到.targets文件
<Target Name="Build" />
然后它将运行,但这样做会覆盖现有的Build目标,因此我的应用程序不会构建。我无法弄清楚这个逻辑 - 它没有意义。我现在正在使用Compile目标,但是如果有人可以解释为什么在Build任务不起作用之前尝试执行它我真的很感激。
答案 0 :(得分:9)
&#39;生成&#39;是一个特殊的内置目标,因此与其他大多数目标的工作方式不同。它肯定无法安全地被覆盖。
最相关的文档在这里:https://msdn.microsoft.com/en-us/library/ms366724.aspx
如果你想在构建之前运行某些东西,标准方法(由新创建的.csproj文件中的注释推荐)是覆盖BeforeBuild目标(如上所述)。
但是,这不是最强大的解决方案。如上文所述:
覆盖预定义目标是扩展构建过程的简单方法,但是,由于MSBuild按顺序评估目标定义,因此无法阻止导入项目的其他项目覆盖已覆盖的目标。
更好(并且稍微复杂一点),覆盖BuildDependsOn属性并扩展此属性的默认值以包含您要运行的目标(这也在上面的链接中记录)。 / p>
另一种方法是将BeforeBuild保持为空并使用BeforeTargets="BeforeBuild"
,这感觉有点奇怪,但非常简单,即使OverBuild目标被覆盖,它仍然可以工作。
至于为什么BeforeTargets="Build"
无效,我无法在文档中找到对此的参考,但我认为这与其特殊性质有关。它与普通目标的工作方式不同,最好不要将其视为目标。