Msbuild 使用BeforeTargets=";时目标未运行;“建立”;在构建服务器上
我有一个自定义的.targets文件,我将它导入到C#MVC web应用程序的项目文件中。我已将自定义目标添加到该列表中,如下所示:Msbuild 使用BeforeTargets=";时目标未运行;“建立”;在构建服务器上,msbuild,teamcity,Msbuild,Teamcity,我有一个自定义的.targets文件,我将它导入到C#MVC web应用程序的项目文件中。我已将自定义目标添加到该列表中,如下所示: <Target Name="CopyFiles" BeforeTargets="Build"></Target> 在VisualStudio下构建时,这很好,但是当我使用TeamCity构建它时,目标永远不会运行,我也不知道为什么 如果我将目标更改为使用BeforeTargets=“Compile”,则它将运行。或者,如果我在.tar
<Target Name="CopyFiles" BeforeTargets="Build"></Target>
在VisualStudio下构建时,这很好,但是当我使用TeamCity构建它时,目标永远不会运行,我也不知道为什么
如果我将目标更改为使用BeforeTargets=“Compile”,则它将运行。或者,如果我在.targets文件中添加一个名为Build的附加目标
<Target Name="Build" />
然后它将运行,但这样做会覆盖现有的构建目标,因此我的应用程序不会构建。我不太明白这其中的逻辑——这毫无意义。我现在使用的是编译目标,但是如果有人能解释为什么在构建任务之前尝试执行它不起作用,我会非常感激。'Build'是一个特殊的内置目标,因此与大多数其他目标的工作方式不一样。它绝对不能被安全地覆盖 最相关的文件如下: 如果您希望在构建之前运行一些东西,标准方法(如新创建的.csproj文件中的注释所建议的)是覆盖BeforeBuild目标(如上所述) 然而,这并不是最健壮的解决方案。如上述文件所述: 覆盖预定义目标是扩展生成过程的一种简单方法,但是,由于MSBuild按顺序计算目标的定义,因此无法阻止导入项目的另一个项目覆盖已覆盖的目标 覆盖BuildDependsOn属性并扩展此属性的默认值以包括您想要运行的目标(这也在上面的链接中有说明)更好(而且更复杂) 另一种方法是将BeforeBuild保留为空,并使用
BeforeTargets=“BeforeBuild”
,这感觉有点奇怪,但非常简单,即使覆盖BeforeBuild目标,它仍然可以工作
至于为什么
BeforeTargets=“Build”
不起作用,我在文档中找不到这方面的参考,但我认为这与它的特殊性质有关。它的工作原理与普通目标不同,最好不要将其视为目标。您的自定义目标文件是否由TeamCity获取?它确实被添加到你们的风投中了吗?是的,是的。如前所述,如果我将其更改为使用BeforeTargets=“Compile”,那么它将运行。只是不适用于生成任务。这是不正确的,Build
是在Microsoft.Common.CurrentVersion.targets
中定义的,其行为与任何其他目标类似BeforeTargets=“Build”
完全有效。问题是,构建
目标是一个没有实际实体的虚拟目标,并不总是根据情况调用。具体细节取决于VS版本和项目类型,尤其是web项目的变体太多。这就是为什么BeforeBuild
是基于Micrsoft.Common.targets
的所有东西的保证扩展点。