Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Msbuild 使用BeforeTargets=";时目标未运行;“建立”;在构建服务器上_Msbuild_Teamcity - Fatal编程技术网

Msbuild 使用BeforeTargets=";时目标未运行;“建立”;在构建服务器上

Msbuild 使用BeforeTargets=";时目标未运行;“建立”;在构建服务器上,msbuild,teamcity,Msbuild,Teamcity,我有一个自定义的.targets文件,我将它导入到C#MVC web应用程序的项目文件中。我已将自定义目标添加到该列表中,如下所示: <Target Name="CopyFiles" BeforeTargets="Build"></Target> 在VisualStudio下构建时,这很好,但是当我使用TeamCity构建它时,目标永远不会运行,我也不知道为什么 如果我将目标更改为使用BeforeTargets=“Compile”,则它将运行。或者,如果我在.tar

我有一个自定义的.targets文件,我将它导入到C#MVC web应用程序的项目文件中。我已将自定义目标添加到该列表中,如下所示:

<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
的所有东西的保证扩展点。