为什么MSBuild不执行多个目标?

为什么MSBuild不执行多个目标?,msbuild,teamcity,Msbuild,Teamcity,我在一个xml文件中设置了多个目标。我希望所有目标都能运行,但只有第一个目标会被执行 以下是我试图做的一个简化版本: <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Target Name="T1"> <Copy SourceFiles="c:\temp\a.txt" DestinationFolder="C:\temp2\" /> </

我在一个xml文件中设置了多个目标。我希望所有目标都能运行,但只有第一个目标会被执行

以下是我试图做的一个简化版本:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="T1">
    <Copy SourceFiles="c:\temp\a.txt" DestinationFolder="C:\temp2\" />    
  </Target>
  <Target Name="T2">
    <Copy SourceFiles="c:\temp\b.txt" DestinationFolder="C:\temp2\" />    
  </Target>
</Project>

我正在从TeamCity CI服务器运行生成,日志报告进程退出代码:0


有人知道为什么不运行T2吗

您需要告诉MSBuild您的多个目标

试一试


MSBuild允许您定义默认目标,并允许您定义目标之间的依赖关系。如果未定义默认值,则它将运行找到的第一个默认值。使用DefaultTargets,您可以调用多个:

<Project DefaultTargets="T1;T2">

一个目标应该完成一个明确定义的步骤。例如,清理目标将删除清理项目所需的所有必要文件和文件夹。Compile将编译所有DLL等

您的目标通常应该声明自己的依赖项:

<Target Name="CI" DependsOnTargets="T1, T2">
</Target>

否则,目标应包含要运行的所有单个步骤:

<Target Name="XX">
    <CallTarget Targets="T1"/>
    <CallTarget Targets="T2"/>
</Target>

MSBuild使用此顺序确定应执行的目标。一旦找到一个值,它就会停止并开始执行

  • 使用msbuild.exe上的/t开关指定的目标
  • 项目元素的DefaultTargets属性中包含的目标
  • 在构建脚本中找到的第一个目标(实际上稍微复杂一些)
正如前面的评论员所说,您可以使用DependsOnTargets列表让其他目标在该目标之前先执行

关于您的解决方案,AfterTargets仅在MSBuild 4.0中可用,因此它不适用于以前的版本

赛义德·易卜拉欣·哈希米


My Book:

或者,您可以创建一个属性组来定义所有相关目标:

 <PropertyGroup>
        <BuildDependsOn>T1;T2</BuildDependsOn>
 </PropertyGroup>

T1;T2
然后将BuildDependsOn的值作为参数传递,如下所示:

<Target Name="Build" DependsOnTargets="@(BuildDependsOn)"/>


此方法允许在此项目文件之外修改依赖列表,以插入其他所需步骤。有关更多信息,请参见此部分。

感谢指针,实际上我是通过指定:注意,相关目标应该用分号分隔,而不是逗号分隔,如图所示。例如。
<Target Name="Build" DependsOnTargets="@(BuildDependsOn)"/>