17

我在一个 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 吗?

4

4 回答 4

29

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

尝试

<Target Name="Build" DependsOnTargets="T1; T2">
</Target>
于 2009-07-11T04:04:14.083 回答
19

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

<Project DefaultTargets="T1;T2">

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

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

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

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

<Target Name="XX">
    <CallTarget Targets="T1"/>
    <CallTarget Targets="T2"/>
</Target>
于 2009-07-11T04:09:58.207 回答
2

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

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

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

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

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

我的书:Microsoft Build Engine 内部:使用 MSBuild 和 Team Foundation Build

于 2009-07-13T18:44:02.313 回答
0

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

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

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

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

这种方法允许在此项目文件之外修改依赖列表以注入其他必需的步骤。有关更多信息,请参阅此站点

于 2011-05-26T08:28:56.010 回答