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

时间:2009-07-11 04:00:55

标签: msbuild teamcity

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

这是iam尝试做的简化版本:

<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?

4 个答案:

答案 0 :(得分:29)

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

尝试

<Target Name="Build" DependsOnTargets="T1; T2">
</Target>

答案 1 :(得分:18)

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

<Project DefaultTargets="T1;T2">

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

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

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

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

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

答案 2 :(得分:2)

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

  • 使用msbuild.exe上的/ t开关指定的目标
  • Project元素的DefaultTargets属性中包含的目标
  • 在构建脚本中找到的第一个目标(实际上稍微复杂一些

正如之前的评论者所说,您可以使用DependsOnTargets列表让其他目标在该目标之前首先执行。

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

Sayed Ibrahim Hashimi

我的书:Inside the Microsoft Build Engine : Using MSBuild and Team Foundation Build

答案 3 :(得分:0)

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

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

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

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

此方法允许在此项目文件之外修改依赖列表以注入其他所需步骤。有关详细信息,请参阅此site