我有一个MSBuild项目,我需要执行不同的准备操作,从列表中构建一些解决方案,执行一些最终操作。 如果解决方案失败 - 发送一封关于此的电子邮件(写一条消息)。 如果至少有一个解决方案失败 - 整个过程被视为失败,我会发送一封电子邮件(写一条消息)。 为了实现这一点,我在SolutionsToBuild项目组上使用目标批处理。 我检查每个编译的结果并将其存储在CurrentSolutionBuildResult中。 然后我的想法是拥有一个全局属性BuildSucceded,默认值设置为true。 如果解决方案在目标BuildAllSolutions中失败 - 我将此属性设置为false,因此在目标MainTarget的末尾,我可以检查它并编写构建失败或构建成功的消息。 不幸的是,在主要目标结束时,我收到了消息:
构建完所有解决方案后--BuildSucceded是:'true' 建立成功!
虽然我希望将此属性设置为false,因为它在目标BuildAllSolutions的每次迭代中都已完成:
为C:\ SampleSolution \ SampleSolution3.sln构建失败! 目标BuildAllSolutions中的BuildSucceded是:'false'
在这个网站上搜索后我找到了原因: MSBuild Property Scope 但仍然不知道如何解决这个问题(将整个过程标记为失败或成功)因为我不能使用DependsOnTargets解决方法(我希望BuildAllSolutions目标不是在开始时执行,而是在执行其他一些操作之后)。 下面是代码,也许有人可以建议我如何实现我需要的...... 感谢
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" DefaultTargets="MainTarget">
<PropertyGroup>
<BuildSucceded>true</BuildSucceded>
</PropertyGroup>
<ItemGroup>
<SolutionsToBuild Include="C:\SampleSolution\SampleSolution1.sln" />
<SolutionsToBuild Include="C:\SampleSolution\SampleSolution2.sln" />
<SolutionsToBuild Include="C:\SampleSolution\SampleSolution3.sln" />
</ItemGroup>
<Target Name="BuildAllSolutions" Outputs="%(SolutionsToBuild.Identity)">
<Message Text="Building solution '%(SolutionsToBuild.Identity) " />
<MSBuild Projects="%(SolutionsToBuild.Identity) " Properties="Configuration=Debug" ContinueOnError="ErrorAndContinue"/>
<PropertyGroup>
<CurrentSolutionBuildResult>$(MSBuildLastTaskResult)</CurrentSolutionBuildResult>
<BuildSucceded Condition="'$(CurrentSolutionBuildResult)' == 'false' " >false</BuildSucceded>
</PropertyGroup>
<Message Text="Build for %(SolutionsToBuild.Identity) failed!" Condition="'$(CurrentSolutionBuildResult)' == 'false'"/>
<Message Text="Build for %(SolutionsToBuild.Identity) succeded!" Condition="'$(CurrentSolutionBuildResult)' != 'false'"/>
<Message Text=" BuildSucceded in target BuildAllSolutions is:'$(BuildSucceded)'"/>
</Target>
<Target Name="MainTarget" >
<Message Text="Different start operations in MainTarget" />
<Message Text=" Before building all the solutions -BuildSucceded is:'$(BuildSucceded)'"/>
<CallTarget Targets="BuildAllSolutions" ContinueOnError="ErrorAndContinue" />
<Message Text="Different end operations in MainTarget" />
<Message Text=" After building all the solutions -BuildSucceded is:'$(BuildSucceded)'"/>
<Message Text=" Build successful!" Condition=" '$(BuildSucceded)' != 'false' "/>
<Message Text=" Build failed!" Condition=" '$(BuildSucceded)' == 'false' "/>
</Target>
</Project>