我在一个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?
答案 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使用此顺序来确定应执行的目标。一旦找到值,它就会停在那里并开始执行。
正如之前的评论者所说,您可以使用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。