<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Aaron Hallberg : MSBuild</title><link>http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx</link><description>Tags: MSBuild</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>TfsBuild.rsp and Logging Verbosity in Orcas</title><link>http://blogs.msdn.com/aaronhallberg/archive/2007/05/03/tfsbuild-rsp-and-logging-verbosity-in-orcas.aspx</link><pubDate>Thu, 03 May 2007 19:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2396841</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/2396841.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=2396841</wfw:commentRss><description>&lt;P&gt;In the 2.0 .NET Framework, MSBuild's default verbosity for its FileLogger was "normal".&amp;nbsp; As such, if you needed diagnostic logging information in a Team Build build (e.g. for debugging an issue with the build process) you needed to add the following to your TfsBuild.rsp file:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;/verbosity:diagnostic&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;-or more briefly-&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/v:diag&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;In the 3.5 .NET Framework, lots of things have changed with respect to the MSBuild file logger.&amp;nbsp; First of all, the default verbosity for the FileLogger is now "diagnostic" rather than "normal".&amp;nbsp; Secondly, the FileLogger now has its own command-line options - &lt;STRONG&gt;/fileLogger&amp;nbsp;&lt;/STRONG&gt;(/fl)&amp;nbsp;turns on file logging, while &lt;STRONG&gt;/fileLoggerParameters&lt;/STRONG&gt; (/flp) is used to pass parameters into the file logger.&amp;nbsp; So - to set logging versobity back to normal in a Team Build build in Orcas&amp;nbsp;(e.g. when you are &lt;EM&gt;not&lt;/EM&gt; debugging an issue with the build process and want to keep your log files small) you will need to add the following to your TfsBuild.rsp file:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;STRONG&gt;/fileLoggerParameters:verbosity=normal&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;-or more briefly-&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;/flp:v=n&lt;/STRONG&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Another thing you may notice if you look closely is that Team Build no longer passes too many options to MSBuild directly through the command-line.&amp;nbsp; Instead, we dynamically generate a new copy of TfsBuild.rsp that contains the standard Team Build options followed by whatever you have in your checked in TfsBuild.rsp (if anything).&amp;nbsp; As such, a typical TfsBuild.rsp file on a build machine might look something like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;### Begin Team Build Generated Arguments ### &lt;/P&gt;
&lt;P&gt;/m:4&lt;BR&gt;/nologo&lt;BR&gt;/noconsolelogger&lt;BR&gt;/dl:BuildLogger,&lt;EM&gt;&amp;lt;BuildLogger Assembly&amp;gt;;&amp;lt;BuildLogger Parameters&amp;gt;&lt;BR&gt;&lt;/EM&gt;&lt;STRONG&gt;/fl /flp:logfile=BuildLog.txt;encoding=Unicode;&lt;/STRONG&gt;&lt;BR&gt;/p:BuildDefinition="BuildDefinition" &lt;BR&gt;/p:DropLocation="\\MACHINENAME\DropLocation" &lt;BR&gt;/p:BuildProjectFolderPath="$/TeamProject/TeamBuildTypes/BuildDefinition"&lt;BR&gt;/p:BuildUri="vstfs:///Build/Build/1" &lt;BR&gt;/p:TeamFoundationServerUrl="http://tfs:8080"&lt;BR&gt;/p:TeamProject="TeamProject" &lt;BR&gt;/p:SourcesSubdirectory="Sources" &lt;BR&gt;/p:BinariesSubdirectory="Binaries" &lt;BR&gt;/p:TestResultsSubdirectory="TestResults" &lt;BR&gt;/p:SourceGetVersion="C3" &lt;BR&gt;/p:LastGoodBuildLabel="" &lt;BR&gt;/p:LastBuildNumber="" &lt;BR&gt;/p:LastGoodBuildNumber="" &lt;BR&gt;/p:NoCICheckInComment="***NO_CI***" &lt;BR&gt;/p:IsDesktopBuild="false" &lt;BR&gt;/p:TeamBuildRefPath="C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies" &lt;BR&gt;/t:EndToEndIteration 
&lt;P&gt;TFSBuild.proj 
&lt;P&gt;### End Team Build Generated Arguments ### 
&lt;P&gt;### Begin Checked In TfsBuild.rsp Arguments ### 
&lt;P&gt;# This is a response file for MSBuild&lt;BR&gt;# Add custom MSBuild command line options in this file 
&lt;P&gt;&lt;STRONG&gt;/flp:verbosity=normal &lt;/STRONG&gt;
&lt;P&gt;### End Checked In TfsBuild.rsp Arguments ###&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Again, if you look carefully here you may notice the &lt;STRONG&gt;/m:4&lt;/STRONG&gt; option at the top of the sample rsp file.&amp;nbsp; This has to do with MSBuild 3.5's new multi-process feature - more on this in a subsequent post!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2396841" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+Orcas/default.aspx">Team Build Orcas</category></item><item><title>Adding Build Steps to Team Build in orcas</title><link>http://blogs.msdn.com/aaronhallberg/archive/2007/03/28/adding-build-steps-to-team-build-in-orcas.aspx</link><pubDate>Wed, 28 Mar 2007 18:00:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1976950</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/1976950.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=1976950</wfw:commentRss><description>&lt;P&gt;Way back in August I did a &lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx" mce_href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx"&gt;post&lt;/A&gt;&amp;nbsp;(my 2nd ever!) on adding build steps to Team Build using a custom task.&amp;nbsp; I thought I would revisit this topic in the context of the latest version of Team Build, now available in the &lt;A href="http://blogs.msdn.com/buckh/archive/2007/02/28/orcas-march-ctp-is-available-now-and-includes-new-team-foundation-server.aspx" mce_href="http://blogs.msdn.com/buckh/archive/2007/02/28/orcas-march-ctp-is-available-now-and-includes-new-team-foundation-server.aspx"&gt;March CTP&lt;/A&gt; of Orcas. &lt;/P&gt;
&lt;P&gt;In Orcas, you'll have two options for adding build steps - the built-in &lt;EM&gt;BuildStep&lt;/EM&gt; task, or your own custom task using the brand new Team Build Object Model (OM).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The BuildStep task can be used in two distinct ways: you can &lt;EM&gt;add&lt;/EM&gt; build steps and you can &lt;EM&gt;update&lt;/EM&gt; build steps:&amp;nbsp; &lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;DoStuff&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;

    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;BuildStep&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(TeamFoundationServerUrl)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;BuildUri&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(BuildUri)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Message&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;Doing some stuff...&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Output&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;TaskParameter&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;Id&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;PropertyName&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;StepId&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;BuildStep&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;

    &amp;lt;!--&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Do some stuff here... &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;--&amp;gt;

    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;BuildStep&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(TeamFoundationServerUrl)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;BuildUri&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(BuildUri)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(StepId)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Status&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;Succeeded&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;

    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;OnError&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;ExecuteTargets&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;MarkBuildStepAsFailed&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;
    
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;

  &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Name&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;MarkBuildStepAsFailed&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;BuildStep&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(TeamFoundationServerUrl)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;BuildUri&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(BuildUri)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Id&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(StepId)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Status&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;Failed&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;
    
  &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;In this example, a build step is added, some stuff happens, and the build step is updated.&amp;nbsp; Note the error handling which marks the step as Failed when an error occurs in the &lt;EM&gt;DoStuff&lt;/EM&gt; target.&lt;/P&gt;
&lt;P&gt;If you don't have any &lt;EM&gt;stuff&lt;/EM&gt; to do, and just want to add an informational build step, you can ignore the ID output property and set the Status immediately when you add the build step.&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;BuildStep&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(TeamFoundationServerUrl)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;BuildUri&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(BuildUri)&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Message&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;This is an informational message.&lt;/SPAN&gt;"
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;               &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Status&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;Succeeded&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;
&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;And that's it!&amp;nbsp; &lt;/P&gt;
&lt;P&gt;There are still situations where you'll want to add build steps using your own custom tasks, of course.&amp;nbsp; In this case, you can use the new OM, which should be a bit simpler than using the old web service methods.&amp;nbsp; &lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;using&lt;/SPAN&gt; System;
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;using&lt;/SPAN&gt; Microsoft.Build.Framework;
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Client;
&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Client;

&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;namespace&lt;/SPAN&gt; CustomTasks
{
    &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;class&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;TeamBuildTask&lt;/SPAN&gt; : &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ITask
&lt;/SPAN&gt;    {
        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Put real task logic in this method.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt;True if task is successful, otherwise false.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/returns&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;bool&lt;/SPAN&gt; ExecuteInternal();

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Returns the name of the build step to be added for this task.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt;Name of the build step to be added.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/returns&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; GetBuildStepName();

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Returns the message of the build step to be added for this task - this is the
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; string displayed in the Team Build GUI.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt;Message of the build step to be added.&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/returns&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; GetBuildStepMessage();

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; ITask implementation - BuildEngine property.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildEngine&lt;/SPAN&gt; BuildEngine
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_buildEngine;
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;set
&lt;/SPAN&gt;            {
                m_buildEngine = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; ITask implementation - HostObject property.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ITaskHost&lt;/SPAN&gt; HostObject
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_hostObject;
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;set
&lt;/SPAN&gt;            {
                m_hostObject = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; The Url of the Team Foundation Server.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        [&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Required&lt;/SPAN&gt;]
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; TeamFoundationServerUrl
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_tfsUrl;
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;set
&lt;/SPAN&gt;            {
                m_tfsUrl = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; The Uri of the Build for which this task is executing.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        [&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Required&lt;/SPAN&gt;]
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; BuildUri
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_buildUri;
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;set
&lt;/SPAN&gt;            {
                m_buildUri = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Lazy init property that gives access to the TF Server specified by TeamFoundationServerUrl.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;TeamFoundationServer&lt;/SPAN&gt; Tfs
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (m_tfs == &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;null&lt;/SPAN&gt;)
                {
                    &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;String&lt;/SPAN&gt;.IsNullOrEmpty(TeamFoundationServerUrl))
                    {
                        &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// Throw some exception.
&lt;/SPAN&gt;                    }
                    m_tfs = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;TeamFoundationServerFactory&lt;/SPAN&gt;.GetServer(TeamFoundationServerUrl);
                }
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_tfs;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Lazy init property that gives access to the BuildServer service of the TF Server.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildServer&lt;/SPAN&gt; BuildServer
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (m_buildServer == &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;null&lt;/SPAN&gt;)
                {
                    m_buildServer = (&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildServer&lt;/SPAN&gt;)Tfs.GetService(&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;typeof&lt;/SPAN&gt;(&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildServer&lt;/SPAN&gt;));
                }
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_buildServer;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; Lazy init property that gives access to the Build specified by BuildUri.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildDetail&lt;/SPAN&gt; Build
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;get
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;if&lt;/SPAN&gt; (m_build == &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;null&lt;/SPAN&gt;)
                {
                    m_build = (&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildDetail&lt;/SPAN&gt;)BuildServer.GetBuild(&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;new&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Uri&lt;/SPAN&gt;(BuildUri), &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;null&lt;/SPAN&gt;, &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;QueryOptions&lt;/SPAN&gt;.None);
                }
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; m_build;
            }
        }

        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; ITask implementation - Execute method.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/summary&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;returns&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; True if the task succeeded, false otherwise.
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(128,128,128)"&gt;///&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,128,0)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(128,128,128)"&gt;&amp;lt;/returns&amp;gt;
&lt;/SPAN&gt;        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;bool&lt;/SPAN&gt; Execute()
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;bool&lt;/SPAN&gt; returnValue = &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;false&lt;/SPAN&gt;;

            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;try
&lt;/SPAN&gt;            {
                AddBuildStep();
                returnValue = ExecuteInternal();
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;catch&lt;/SPAN&gt; (&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Exception&lt;/SPAN&gt; e)
            {
                AddExceptionBuildStep(e);
                &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;throw&lt;/SPAN&gt;;
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;finally
&lt;/SPAN&gt;            {
                UpdateBuildStep(returnValue);
            }

            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;return&lt;/SPAN&gt; returnValue;
        }

        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;void&lt;/SPAN&gt; AddBuildStep()
        {
            m_buildStep = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;InformationNodeConverters&lt;/SPAN&gt;.AddBuildStep(Build, GetBuildStepName(), GetBuildStepMessage());
        }

        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;void&lt;/SPAN&gt; UpdateBuildStep(&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;bool&lt;/SPAN&gt; result)
        {
            m_buildStep.Status = result ? &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;BuildStepStatus&lt;/SPAN&gt;.Succeeded : &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;BuildStepStatus&lt;/SPAN&gt;.Failed;
            m_buildStep.FinishTime = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DateTime&lt;/SPAN&gt;.Now;
            m_buildStep.Save();
        }

        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;void&lt;/SPAN&gt; AddExceptionBuildStep(&lt;SPAN style="COLOR: rgb(43,145,175)"&gt;Exception&lt;/SPAN&gt; e)
        {
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;try
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildStep&lt;/SPAN&gt; buildStep = &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;InformationNodeConverters&lt;/SPAN&gt;.AddBuildStep(Build, &lt;SPAN style="COLOR: rgb(163,21,21)"&gt;"Exception"&lt;/SPAN&gt;, e.Message, &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;DateTime&lt;/SPAN&gt;.Now, &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;BuildStepStatus&lt;/SPAN&gt;.Failed);
            }
            &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;catch
&lt;/SPAN&gt;            {
                &lt;SPAN style="COLOR: rgb(0,128,0)"&gt;// Eat any exceptions.
&lt;/SPAN&gt;            }
        }

        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildEngine&lt;/SPAN&gt; m_buildEngine;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;ITaskHost&lt;/SPAN&gt; m_hostObject;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; m_tfsUrl;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;string&lt;/SPAN&gt; m_buildUri;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;TeamFoundationServer&lt;/SPAN&gt; m_tfs;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildServer&lt;/SPAN&gt; m_buildServer;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildDetail&lt;/SPAN&gt; m_build;
        &lt;SPAN style="COLOR: rgb(0,0,255)"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: rgb(43,145,175)"&gt;IBuildStep&lt;/SPAN&gt; m_buildStep;
    }
}&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;There are a few things here which require some explanation.&amp;nbsp; &lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;IBuildServer.&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;IBuildServer is the top-level interface in the OM.&amp;nbsp; It exposes methods for getting/querying builds, build definitions (formerly known as build types), build agents (formerly non-existent), etc.&amp;nbsp; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;UL&gt;
&lt;LI&gt;IBuildDetail.&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;IBuildDetail represents an individual build in the OM.&amp;nbsp; It exposes methods such as Stop and Delete; properties such as StartTime and RequestedBy; and events (which support polling for changes) such as StatusChanging and PollingCompleted.&amp;nbsp; It also exposes a tree of arbitrary build information nodes which are used to store all standard Team Build data and can also be used to add any arbitrary custom data.&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;UL&gt;
&lt;LI&gt;InformationNodeConverters and IBuildStep.&lt;/LI&gt;&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;The InformationNodeConverters class can be used to get (and add) standard Team Build data types from the generic build information nodes associated with a build.&amp;nbsp; Each well-known data type is exposed as an interface - build steps are exposed via IBuildStep.&amp;nbsp; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;I'll go into more details on&amp;nbsp;the&amp;nbsp;OM in later posts&amp;nbsp;- hopefully this will be enough info to get those of you playing around with the March CTP started and to get those of you &lt;EM&gt;not&lt;/EM&gt; playing around with the CTP interested in doing so!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1976950" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+Orcas/default.aspx">Team Build Orcas</category></item><item><title>Passing custom properties to individual solutions in Team Build</title><link>http://blogs.msdn.com/aaronhallberg/archive/2007/03/19/passing-custom-properties-to-individual-solutions-in-team-build.aspx</link><pubDate>Mon, 19 Mar 2007 22:54:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1914335</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>12</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/1914335.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=1914335</wfw:commentRss><description>&lt;P&gt;&lt;A href="http://blogs.msdn.com/gautamg/default.aspx" mce_href="http://blogs.msdn.com/gautamg/default.aspx"&gt;Gautam Goenka&lt;/A&gt; posted an &lt;A href="http://blogs.msdn.com/gautamg/archive/2006/04/20/579801.aspx" mce_href="http://blogs.msdn.com/gautamg/archive/2006/04/20/579801.aspx"&gt;article&lt;/A&gt; on this topic way back on April 20, 2006.&amp;nbsp; It included a targets file which overrode the standard Team Build &lt;EM&gt;CoreCompile&lt;/EM&gt; target and allowed user-specified properties to be passed into the MSBuild tast that Team Build uses to build the solution in the SolutionToBuild item group.&amp;nbsp; This approach is fine if you want to pass the same custom property values into each solution in the SolutionToBuild item group, but what if you want to pass &lt;EM&gt;different&lt;/EM&gt; property values into each solution?&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/manishagarwal/default.aspx" mce_href="http://blogs.msdn.com/manishagarwal/default.aspx"&gt;Manish Agarwal&lt;/A&gt;&amp;nbsp;posted an &lt;A href="http://blogs.msdn.com/manishagarwal/archive/2006/03/24/559693.aspx" mce_href="http://blogs.msdn.com/manishagarwal/archive/2006/03/24/559693.aspx"&gt;article&lt;/A&gt;&amp;nbsp;that could help get you started here.&amp;nbsp; His goal was to enable redirecting assemblies to solution-specific subdirectories, but it was easily extendable to passing other user-specified properties on a solution-specific basis.&amp;nbsp; Unfortunately, it also some problems, including breaking the calculation of errors/warnings during the compilation phase of the build.&lt;/P&gt;
&lt;P&gt;Before pressing on, I should say that we &lt;EM&gt;do not recommend overriding the Core* targets in a Team Build build&lt;/EM&gt;.&amp;nbsp; The primary reason here is that you will almost certainly be broken after you upgrade to Orcas if you override these targets, since most of them will be changing radically in that new version.&amp;nbsp; See this &lt;A href="http://blogs.msdn.com/buckh/archive/2006/08/10/core_compile.aspx" mce_href="http://blogs.msdn.com/buckh/archive/2006/08/10/core_compile.aspx"&gt;post&lt;/A&gt;&amp;nbsp;by &lt;A href="http://blogs.msdn.com/buckh/default.aspx" mce_href="http://blogs.msdn.com/buckh/default.aspx"&gt;Buck Hodges&lt;/A&gt;&amp;nbsp;for more details here.&amp;nbsp; The good news here is that the issues that caused people to override the &lt;EM&gt;Core*&lt;/EM&gt; targets in Team Build v1 have been addressed in Orcas, so you should no longer find it necessary to do this sort of thing.&lt;/P&gt;
&lt;P&gt;Having said all that, attached you will find a new &lt;EM&gt;CoreCompile&lt;/EM&gt; override that will allow you pass custom property values into each solution via solution-specific metadata.&amp;nbsp; For example, if you wanted each solution to be signed with a different key file you could do something like:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Include&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(SolutionRoot)\foo.sln&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Properties&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;SignAssembly=true;AssemblyOriginatorKeyFile=C:\foo.snk&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Properties&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Include&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(SolutionRoot)\bar.sln&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Properties&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;SignAssembly=true;AssemblyOriginatorKeyFile=C:\bar.snk&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Properties&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;NOTE:&amp;nbsp; My original example here, which purported to put individual binaries into individual subdirectories, was broken!&amp;nbsp; Thanks to &lt;A href="http://teamfoundationserver.org/Web/blogs/estebangarcia/default.aspx"&gt;Esteban Garcia&lt;/A&gt; for pointing this out, and sorry for any trouble I might have caused anybody...&amp;nbsp; If you want to put your binaries into individual subdirectories, try out the new attachment and do something like:&lt;/P&gt;&lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Include&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(SolutionRoot)\foo.sln&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Subdirectory&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;foo&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Subdirectory&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Include&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(SolutionRoot)\bar.sln&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
      &amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Subdirectory&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;&lt;/SPAN&gt;bar&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Subdirectory&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
    &amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;SolutionToBuild&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;gt;
&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;P&gt;To use this modified CoreCompile target, just:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Download the attached &lt;EM&gt;CoreCompileOverride.targets&lt;/EM&gt; file and check it in alongside TfsBuild.proj.&amp;nbsp; (Alternatively, you can install this file somewhere on your build machine(s) and modify the import directory in step 2) 
&lt;LI&gt;Add an &amp;lt;import&amp;gt; statement to your TfsBuild.proj file - something like:&amp;nbsp; &lt;PRE class=code&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(163,21,21)"&gt;Import&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; &lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(255,0,0)"&gt;Project&lt;/SPAN&gt;&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;=&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt;$(MSBuildProjectDirectory)\CoreCompileOverride.targets&lt;/SPAN&gt;"&lt;SPAN style="COLOR: rgb(0,0,255)"&gt; /&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;A href="http://11011.net/software/vspaste" mce_href="http://11011.net/software/vspaste"&gt;&lt;/A&gt;
&lt;LI&gt;Add your custom properties to each item in the &lt;EM&gt;SolutionToBuild&lt;/EM&gt; item group.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Hopefully you'll find this useful!&amp;nbsp; Let me know via comments if you run into any issues with the attached file, etc.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1914335" width="1" height="1"&gt;</description><enclosure url="http://blogs.msdn.com/aaronhallberg/attachment/1914335.ashx" length="6248" type="application/octet-stream" /><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>The Triumphant Return?</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/12/14/the-triumphant-return.aspx</link><pubDate>Thu, 14 Dec 2006 18:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1285840</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/1285840.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=1285840</wfw:commentRss><description>&lt;P&gt;Wow - it's been a long time.&amp;nbsp;Sorry for the insanely long delay between posts, loyal reader(s).&amp;nbsp;A lot has happened since I last managed to post something on my blog:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;I've been working like crazy, along with the rest of the Team Build team, to get our Continuous Integration solution finished up for the Orcas release (see Brian Harry's blog post &lt;A href="http://blogs.msdn.com/bharry/archive/2006/11/30/team-foundation-server-roadmap.aspx" mce_href="http://blogs.msdn.com/bharry/archive/2006/11/30/team-foundation-server-roadmap.aspx"&gt;here&lt;/A&gt;&amp;nbsp;for the full TFS roadmap, or Buck Hodge's post &lt;A href="http://blogs.msdn.com/buckh/archive/2006/12/02/more-on-the-orcas-features-for-team-build.aspx" mce_href="http://blogs.msdn.com/buckh/archive/2006/12/02/more-on-the-orcas-features-for-team-build.aspx"&gt;here&lt;/A&gt;&amp;nbsp;for more details on the Team Build features in Orcas).&lt;/LI&gt;
&lt;LI&gt;I got hooked on that Ugly Betty show.&amp;nbsp;At first the hourlong format put me off, but now I can't imagine it being any shorter.&lt;/LI&gt;
&lt;LI&gt;Control of the House and Senate shifted to the Democrats. &lt;/LI&gt;
&lt;LI&gt;Britney and Kevin broke up, just days after my wife and I dressed as the two of them for Halloween.&amp;nbsp;Coincidence? Perhaps...&lt;/LI&gt;
&lt;LI&gt;&lt;A href="http://www.microsoft.com/windowsvista/" mce_href="http://www.microsoft.com/windowsvista/"&gt;Vista&lt;/A&gt;, &lt;A href="http://office.microsoft.com/" mce_href="http://office.microsoft.com/"&gt;Office&lt;/A&gt;, and the &lt;A href="http://www.zune.net/en-US/meetzune/device.htm" mce_href="http://www.zune.net/en-US/meetzune/device.htm"&gt;Zune&lt;/A&gt; all shipped. One very positive aspect of the Zune launch from my point of view&amp;nbsp;- my favorite radio station, &lt;A href="http://www.kexp.org/" mce_href="http://www.kexp.org"&gt;KEXP&lt;/A&gt;,&amp;nbsp;was heavily involved&amp;nbsp;and various excellent bands (e.g. &lt;A href="http://www.bandofhorses.com/" mce_href="http://www.bandofhorses.com/"&gt;Band of Horses&lt;/A&gt;) have been featured in ad spots, etc.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;In any case, during a conference call the other day, a Team Build user expressed a desire to easily insert build steps into a build from within a csproj file...&amp;nbsp;In previous posts I have laid out custom tasks which, as part of their execution, insert build steps. In this post, I lay out a simpler custom task which inserts arbitrary text as a build step - think of it as a &amp;lt;Message&amp;gt; task in Team Build form.&lt;/P&gt;
&lt;P&gt;Here's the code:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Framework;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Utilities;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Client;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Proxy;

&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; CustomTasks
{
    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; BuildStepTask : Task
    {
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Execute the task logic.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;True. Exceptions thrown on failure.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; Execute()
        {
            BuildStore.AddBuildStep(BuildUri, Text, Text);
            BuildStore.UpdateBuildStep(BuildUri, Text, DateTime.Now, m_buildStatus);

            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The text of the build step.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; String Text
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_text;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_text = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The status of the build step. If not specified, BuildStepStatus.Succeeded will be assumed.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; String Status
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildStatus.ToString();
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #008000"&gt;// Go ahead and throw an exception if the value is invalid.&lt;/SPAN&gt;
                m_buildStatus = (BuildStepStatus)Enum.Parse(&lt;SPAN style="COLOR: #0000ff"&gt;typeof&lt;/SPAN&gt;(BuildStepStatus), &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;);
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The Url of the Team Foundation Server.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; String TeamFoundationServerUrl
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_tfsUrl;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_tfsUrl = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The Uri of the Build for which this task is executing.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; String BuildUri
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildUri;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_buildUri = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Lazy init property that gives access to the TF Server specified by TeamFoundationServerUrl.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; TeamFoundationServer Tfs
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (m_tfs == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)
                {
                    m_tfs = TeamFoundationServerFactory.GetServer(TeamFoundationServerUrl);
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_tfs;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Lazy init property that gives access to the BuildStore service of the TF Server.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; BuildStore BuildStore
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (m_buildStore == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)
                {
                    m_buildStore = (BuildStore)Tfs.GetService(&lt;SPAN style="COLOR: #0000ff"&gt;typeof&lt;/SPAN&gt;(BuildStore));
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildStore;
            }
        }

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; String m_text;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; BuildStepStatus m_buildStatus = BuildStepStatus.Succeeded;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; String m_tfsUrl;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; String m_buildUri;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; TeamFoundationServer m_tfs;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; BuildStore m_buildStore;
    }
}
&lt;/PRE&gt;
&lt;P&gt;And here's a snippet from the csproj file I used to test it out:&lt;/P&gt;&lt;PRE&gt;  &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UsingTask&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CustomTasks.BuildStepTask"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;AssemblyFile&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"..\TeamBuildTypes\HelloWorld\CustomTasks.dll"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

  &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"AfterCompile"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Condition&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;" '$(BuildUri)' != '' "&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
    &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BuildStepTask&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(TeamFoundationServerUrl)"&lt;/SPAN&gt;
                   &lt;SPAN style="COLOR: #ff0000"&gt;BuildUri&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(BuildUri)"&lt;/SPAN&gt;
                   &lt;SPAN style="COLOR: #ff0000"&gt;Text&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Finished compiling $(AssemblyName)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;
  &lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Note the condition on the Target to avoid running it outside of a Team Build environment.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Hopefully this post will be the first of many in the months to come. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1285840" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>Determining Whether Tests Passed in Team Build</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/21/determining-whether-tests-passed-in-team-build.aspx</link><pubDate>Thu, 21 Sep 2006 20:26:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:764951</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/764951.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=764951</wfw:commentRss><description>&lt;P&gt;In a &lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=647070&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=647070&amp;amp;SiteID=1"&gt;forum post&lt;/A&gt; a while back, I laid out a method for determining whether tests had passed during a build.&amp;nbsp; More recently, I have linked to this forum post in advising others on similar problems.&amp;nbsp; Unfortunately, as a sharp user pointed out in this same thread, my solution doesn't actually work, since it relies on a property that is not accessible in Team Build v1!&lt;/P&gt;
&lt;P&gt;So - to remedy the situation I have written a custom task which can be used to determine whether tests have succeeded or not.&amp;nbsp; This task takes advantage of the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.gettestresultsforbuild.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.gettestresultsforbuild.aspx"&gt;GetTestResultsForBuild&lt;/A&gt;&amp;nbsp;method of the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.aspx"&gt;Microsoft.TeamFoundation.Build.Proxy.BuildStore&lt;/A&gt;&amp;nbsp;class.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;As always, this task is provided as a sample only; its awesomeness cannot be guaranteed, etc.&amp;nbsp; The task inherits from the TeamBuildTask class I presented in an &lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx" mce_href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx"&gt;earlier post&lt;/A&gt;.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web.Services;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Framework;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Utilities;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Client;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Common;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Proxy;

&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; MyNamespace
{
    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; CheckForTestSuccess : TeamBuildTask
    {
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The ConfigurationToBuild Item Group for the Build.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; ITaskItem[] ConfigurationToBuild
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_configurationToBuild;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_configurationToBuild = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// An output property which will be true if all test runs succeeded and false otherwise.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        [Output]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; TestSuccess
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_testSuccess;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_testSuccess = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Returns the name of the build step to be added for this task.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;Name of the build step to be added.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; GetBuildStepName()
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; "&lt;SPAN style="COLOR: #8b0000"&gt;CheckForTestSuccess&lt;/SPAN&gt;";
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Returns the message of the build step to be added for this task - this is the&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// string displayed in the Team Build GUI.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;Message of the build step to be added.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; GetBuildStepMessage()
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; "&lt;SPAN style="COLOR: #8b0000"&gt;Checking for test success.&lt;/SPAN&gt;";
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Put real task logic in this method.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;True if task is successful, otherwise false.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; ExecuteInternal()
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; platform;
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; flavor;
            TestResultData[] testResults;

            m_testSuccess = &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;

            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (ITaskItem configuration &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ConfigurationToBuild)
            {
                platform = configuration.GetMetadata("&lt;SPAN style="COLOR: #8b0000"&gt;PlatformToBuild&lt;/SPAN&gt;");
                flavor   = configuration.GetMetadata("&lt;SPAN style="COLOR: #8b0000"&gt;FlavorToBuild&lt;/SPAN&gt;");

                testResults = BuildStore.GetTestResultsForBuild(BuildUri, platform, flavor);

                &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (TestResultData testResult &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; testResults)
                {
                    &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (!testResult.RunPassed)
                    {
                        m_testSuccess = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;
                        &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                    }
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (!m_testSuccess)
                {
                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
                }
            }

            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;
        }

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; ITaskItem[] m_configurationToBuild;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; m_testSuccess;
    }
}
&lt;/PRE&gt;
&lt;P&gt;To use this task, you'll need to do something like the following in TfsBuild.proj:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UsingTask&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CheckForTestSuccess"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;AssemblyFile&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CustomTasks.dll"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"AfterTest"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;CheckForTestSuccess&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(TeamFoundationServerUrl)"&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;BuildUri&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(BuildUri)"&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;ConfigurationToBuild&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"@(ConfigurationToBuild)"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Output&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskParameter&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"TestSuccess"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;PropertyName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"TestSuccess"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;CheckForTestSuccess&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The property &lt;EM&gt;TestSuccess&lt;/EM&gt; would then be 'true' if and only if &lt;EM&gt;all&lt;/EM&gt; test runs succeeded for the build.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=764951" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>Building a Specific Version with Team Build</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/19/building-a-specific-version-with-team-build.aspx</link><pubDate>Tue, 19 Sep 2006 17:40:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:762105</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>9</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/762105.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=762105</wfw:commentRss><description>&lt;P&gt;Team Build by default gets the &lt;EM&gt;latest&lt;/EM&gt; version of your sources (or &lt;EM&gt;tip&lt;/EM&gt;) from source control.&amp;nbsp; For the most part, this is probably the behavior you would want and expect.&amp;nbsp; But not always - you might want to reproduce a particular build that got deleted, for example; or you might want to build your latest changest without including changes other users might have checked in.&lt;/P&gt;
&lt;P&gt;Unfortunately, getting (and therefore &lt;EM&gt;building&lt;/EM&gt;) a specific version from source control is not supported out of the box in Team Build version 1...&amp;nbsp; The &lt;EM&gt;Get&lt;/EM&gt; task used in Team Build (this can be found in &lt;EM&gt;Microsoft.TeamFoundation.Build.targets&lt;/EM&gt;) looks like this:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CoreGet"&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #ff0000"&gt;Condition&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;" '$(IsDesktopBuild)' != 'true' "&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #ff0000"&gt;DependsOnTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(CoreGetDependsOn)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #008000"&gt;&amp;lt;!-- Get all the latest sources from the given workspace--&amp;gt;&lt;/SPAN&gt;	
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Get&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Condition&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;" '$(SkipGet)' != 'true' "&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;Workspace&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(WorkspaceName)"&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;Recursive&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(RecursiveGet)"&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;Force&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(ForceGet)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;
	  
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The &lt;EM&gt;Get&lt;/EM&gt; task also a &lt;EM&gt;Version&lt;/EM&gt; property that is not used here.&amp;nbsp; It defaults to &lt;EM&gt;"T"&lt;/EM&gt;, or the &lt;EM&gt;tip&lt;/EM&gt; version.&amp;nbsp; To get and build a specific version from source control, you will need to set this property.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;There are several options here:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;You can override the &lt;EM&gt;CoreGet&lt;/EM&gt; target in TfsBuild.proj.&lt;/LI&gt;
&lt;LI&gt;You can modify the &lt;EM&gt;CoreGet&lt;/EM&gt; target in&amp;nbsp;&lt;EM&gt;Microsoft.TeamFoundation.Build.targets&lt;/EM&gt; directly.&lt;/LI&gt;
&lt;LI&gt;You can set the &lt;EM&gt;SkipGet &lt;/EM&gt;property to true and override &lt;EM&gt;BeforeGet&lt;/EM&gt; or &lt;EM&gt;AfterGet&lt;/EM&gt; instead.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Modifying &lt;EM&gt;Microsoft.TeamFoundation.Build.targets&lt;/EM&gt; is not a good idea - this would need to be done on every build machine, could get wiped out during an upgrade or installation repair, etc.&amp;nbsp; Overriding &lt;EM&gt;CoreGet&lt;/EM&gt; is usually not recommended either, since the &lt;EM&gt;CoreXX&lt;/EM&gt; targets will almost certainly be changing in the next release of Team Build.&amp;nbsp; In this case, however, overriding &lt;EM&gt;CoreGet&lt;/EM&gt; (option 1) is essentially indistinguishable from setting &lt;EM&gt;SkipGet&lt;/EM&gt; and overriding &lt;EM&gt;BeforeGet / AfterGet&lt;/EM&gt; (option 3) and is simpler.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So - to override &lt;EM&gt;CoreGet&lt;/EM&gt; in TfsBuild.proj, you will want to do something like the following:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CoreGet"&lt;/SPAN&gt;
	  &lt;SPAN style="COLOR: #ff0000"&gt;Condition&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;" '$(IsDesktopBuild)'!='true' "&lt;/SPAN&gt;
	  &lt;SPAN style="COLOR: #ff0000"&gt;DependsOnTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(CoreGetDependsOn)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #008000"&gt;&amp;lt;!-- Get all the latest sources from the given workspace--&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Get&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Condition&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;" '$(SkipGet)'!='true' "&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #ff0000"&gt;Workspace&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(WorkspaceName)"&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #ff0000"&gt;Recursive&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(RecursiveGet)"&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #ff0000"&gt;Force&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(ForceGet)"&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #ff0000"&gt;Version&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(VersionToGet)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;
	  
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;At this point, you just need to set the&amp;nbsp;&lt;EM&gt;VersionToGet&lt;/EM&gt; property to whatever version you would like to get.&amp;nbsp; This can be done in all the normal MSBuild ways - via the command line (put a string in your TfsBuild.rsp file similar to &lt;EM&gt;/p:VersionToGet=&amp;lt;VersionSpec&amp;gt;&lt;/EM&gt;), declaratively in a &lt;EM&gt;PropertyGroup&lt;/EM&gt; element, programmatically with a &lt;EM&gt;CreateProperty&lt;/EM&gt; task, or via an environment variable.&lt;/P&gt;
&lt;P&gt;To reproduce a particular build, you will typically want to set &lt;EM&gt;VersionToGet&lt;/EM&gt; to a label-based version spec similar to "L&amp;lt;build number&amp;gt;" (unless you have modified your build process to use some other labeling scheme).&amp;nbsp; For example, if you build number is "MyBuild_20060919.1" you could do something like this:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;PropertyGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;VersionToGet&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;LMyBuild_20060919.1&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;VersionToGet&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;PropertyGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=762105" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>MSBuild Batching - Generate a Cross-Product (continued)</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/07/msbuild-batching-generate-a-cross-product-continued.aspx</link><pubDate>Thu, 07 Sep 2006 23:06:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:744940</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/744940.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=744940</wfw:commentRss><description>&lt;P&gt;As promised, here is the code for the ItemGroupCrossProduct task presented in a &lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2006/09/05/741125.aspx" mce_href="http://blogs.msdn.com/aaronhallberg/archive/2006/09/05/741125.aspx"&gt;previous&lt;/A&gt;&amp;nbsp;post:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Collections.Generic;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Framework;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Utilities;

&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; CustomTasks
{
    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; ItemGroupCrossProduct : Task
    {
        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; ITaskItem[] ItemGroup1
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_itemGroup1;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_itemGroup1 = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; MetaData1
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_metaData1;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_metaData1 = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; ITaskItem[] ItemGroup2
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_itemGroup2;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_itemGroup2 = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        [Required]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; MetaData2
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_metaData2;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_metaData2 = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;
            }
        }

        [Output]
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; ITaskItem[] CombinedItemGroup
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_combinedItemGroup;
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Task implementation - Execute method.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// True if the task succeeded, false otherwise.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/returns&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;override&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; Execute()
        {
            List&amp;lt;TaskItem&amp;gt; newItems = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; List&amp;lt;TaskItem&amp;gt;();

            &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (ITaskItem item1 &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup1)
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (ITaskItem item2 &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup2)
                {
                    TaskItem newItem = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; TaskItem(item2.ItemSpec);
                    newItem.SetMetadata(MetaData1, item1.GetMetadata(MetaData1));
                    newItem.SetMetadata(MetaData2, item2.GetMetadata(MetaData2));
                    newItems.Add(newItem);
                }
            }

            m_combinedItemGroup = newItems.ToArray();

            &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;true&lt;/SPAN&gt;;
        }

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; ITaskItem[] m_itemGroup1;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; m_metaData1;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; ITaskItem[] m_itemGroup2;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; m_metaData2;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; ITaskItem[] m_combinedItemGroup;
    }
}&lt;/PRE&gt;
&lt;P&gt;The idea of the task is to take in two collections of Items and two corresponding metadata property names and produce a new Item collection which contains the cross product of the two inputs.&amp;nbsp; This is a cross product in a rather limited sense - the resulting Items will contain only the two metadata properties specified in the input properties.&amp;nbsp; Any other metadata properties in either of the input Item collections will be ignored.&amp;nbsp; Additionally, the &lt;EM&gt;Identity&lt;/EM&gt; values of the resulting Items are determined by the ItemGroup2 Items. &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=744940" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>MSBuild Batching - Generating a Cross-Product</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/05/msbuild-batching-generating-a-cross-product.aspx</link><pubDate>Tue, 05 Sep 2006 17:13:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:741125</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/741125.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=741125</wfw:commentRss><description>&lt;P&gt;I've been playing around with the batching functionality in MSBuild quite a bit lately, and thought I'd share my various little discoveries with the world...&amp;nbsp; If you aren't sure what batching is in MSBuild, check out &lt;A href="http://msdn2.microsoft.com/en-us/library/ms171473.aspx" target=_blank mce_href="http://msdn2.microsoft.com/en-us/library/ms171473.aspx"&gt;this&lt;/A&gt;&amp;nbsp;MSDN page.&amp;nbsp; Alternatively, here's my five second explanation - batching allows you to simulate a &lt;EM&gt;foreach&lt;/EM&gt; loop over the Items in an ItemGroup.&amp;nbsp; For example:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/SPAN&gt;xml version="1.0" encoding="utf-8"&lt;SPAN style="COLOR: #0000ff"&gt;?&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;DefaultTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFoo"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;xmlns&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;1&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;2&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFoo"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Message&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Importance&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"high"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Text&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"FooMetadata=%(Foo.FooMetadata)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The &lt;EM&gt;Message&lt;/EM&gt; task in the above MSBuild file is effectively saying something like:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Item foo &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup)
{
    &amp;lt;Message Importance="&lt;SPAN style="COLOR: #8b0000"&gt;high&lt;/SPAN&gt;" Text="&lt;SPAN style="COLOR: #8b0000"&gt;FooMetadata=&lt;/SPAN&gt;" + foo.FooMetadata /&amp;gt;
}&lt;/PRE&gt;
&lt;P&gt;To try it out, just cut and paste the code into a text file and run MSBuild.exe on it - you should get the following output:&amp;nbsp; &lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Project "c:\foo.txt" (default targets): &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Target PrintFoo:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2&lt;/FONT&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;This isn't quite right, since really the batching occurs over &lt;EM&gt;collections&lt;/EM&gt; of items with identical values for the referenced &lt;EM&gt;metadata&lt;/EM&gt; property (see the above reference MSDN page for details on this).&amp;nbsp; But - to a first approximation this is what is going on.&lt;/P&gt;
&lt;P&gt;Things get interesting when you want to do a loop within a loop...&amp;nbsp; Consider the following:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/SPAN&gt;xml version="1.0" encoding="utf-8"&lt;SPAN style="COLOR: #0000ff"&gt;?&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;DefaultTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;xmlns&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;1&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;2&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;a&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;b&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Message&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Importance&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"high"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Text&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"FooMetadata=%(Foo.FooMetadata), BarMetadata=%(Bar.BarMetadata)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;The first time I tried this, I fully expected to get output like:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Project "c:\foobar.txt" (default targets): &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Target PrintFooAndBar:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1, BarMetadata=a&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1, BarMetadata=b&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2, BarMetadata=a&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2, BarMetadata=b&lt;/FONT&gt; &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Instead, though, I got the following:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Project "c:\foobar.txt" (default targets):&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Target PrintFooAndBar:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=, BarMetadata=a&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=, BarMetadata=b&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1, BarMetadata=&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2, BarMetadata=&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;When MSBuild encounters &lt;EM&gt;two&lt;/EM&gt; collections to batch over, that is, it apparently batches one and then the other - not both at the same time.&amp;nbsp; Back in our &lt;EM&gt;foreach&lt;/EM&gt; syntax, it does something like:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Item foo &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup)
{
    &amp;lt;Message Importance="&lt;SPAN style="COLOR: #8b0000"&gt;high&lt;/SPAN&gt;" Text="&lt;SPAN style="COLOR: #8b0000"&gt;FooMetadata=&lt;/SPAN&gt;" + foo.FooMetadata + "&lt;SPAN style="COLOR: #8b0000"&gt;, BarMetadata=&lt;/SPAN&gt;" /&amp;gt;
}

&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Item bar &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup)
{
    &amp;lt;Message Importance="&lt;SPAN style="COLOR: #8b0000"&gt;high&lt;/SPAN&gt;" Text="&lt;SPAN style="COLOR: #8b0000"&gt;FooMetadata=, BarMetadata=&lt;/SPAN&gt;" + bar.BarMetadata /&amp;gt;
}&lt;/PRE&gt;
&lt;P&gt;How, then, can we get MSBuild to do something more like:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Item foo &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup)
{
	&lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (Item bar &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; ItemGroup)
	{
		&amp;lt;Message Importance="&lt;SPAN style="COLOR: #8b0000"&gt;high&lt;/SPAN&gt;" Text="&lt;SPAN style="COLOR: #8b0000"&gt;FooMetadata=&lt;/SPAN&gt;" + foo.FooMetadata + "&lt;SPAN style="COLOR: #8b0000"&gt;, BarMetadata=&lt;/SPAN&gt;" + bar.BarMetadata /&amp;gt;
	}
}&lt;/PRE&gt;
&lt;P&gt;I have come up with two solutions - perhaps you have others?&amp;nbsp; If so, please post them in the comments!&lt;/P&gt;
&lt;P&gt;(1) Use an MSBuild task to call back into our project file.&lt;/P&gt;
&lt;P&gt;In this solution, we use the &lt;EM&gt;$(MSBuildProjectFile)&lt;/EM&gt; property (a reserved property in MSBuild) to call back into our project file.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/SPAN&gt;xml version="1.0" encoding="utf-8"&lt;SPAN style="COLOR: #0000ff"&gt;?&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;DefaultTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;xmlns&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;1&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;2&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;a&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;b&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;MSBuild&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Projects&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(MSBuildProjectFile)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Targets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"InternalPrintFooAndBar"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Properties&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Foo=%(Foo.FooMetadata)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"InternalPrintFooAndBar"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Message&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Importance&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"high"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Text&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"FooMetadata=$(Foo), BarMetadata=%(Bar.BarMetadata)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;There are various downsides here.&amp;nbsp; The &lt;EM&gt;Message&lt;/EM&gt; task does get executed for each combination of &lt;EM&gt;FooMetadata&lt;/EM&gt; and &lt;EM&gt;BarMetadata&lt;/EM&gt;, but in two separate invocations of the MSBuild task.&amp;nbsp; Our output looks like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;Target PrintFooAndBar:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __________________________________________________&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Project "c:\foobar.txt" is building "c:\foobar.txt" (InternalPrintFooAndBar target(s)): &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Target InternalPrintFooAndBar:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1, BarMetadata=a&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=1, BarMetadata=b&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; __________________________________________________&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Project "c:\foobar.txt" is building "c:\foobar.txt" (InternalPrintFooAndBar target(s)): &lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;FONT face=Arial&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Target InternalPrintFooAndBar:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2, BarMetadata=a&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; FooMetadata=2, BarMetadata=b&lt;/FONT&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Additionally, the &lt;EM&gt;collection &lt;/EM&gt;aspect of batching that I alluded to earlier is lost in this approach.&amp;nbsp; That is, in the &lt;EM&gt;InternalPrintFooAndBar&lt;/EM&gt; target, the &lt;EM&gt;Foo&lt;/EM&gt; item group has been reduced to a single property value, with all of its &lt;EM&gt;ItemGroup&lt;/EM&gt;ness thrown away.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;(2) Write a custom task to generate the cross product.&lt;/P&gt;
&lt;P&gt;In this solution, a custom task is used to explicitly generate a new &lt;EM&gt;ItemGroup&lt;/EM&gt; with the cross product of two input &lt;EM&gt;ItemGroup&lt;/EM&gt;s.&amp;nbsp; (More specifically, the cross product of two sets of &lt;EM&gt;Metadata&lt;/EM&gt; values - these could potentially come from the same &lt;EM&gt;ItemGroup&lt;/EM&gt;)&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;?&lt;/SPAN&gt;xml version="1.0" encoding="utf-8"&lt;SPAN style="COLOR: #0000ff"&gt;?&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;DefaultTargets&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;xmlns&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"http://schemas.microsoft.com/developer/msbuild/2003"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;UsingTask&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CustomTasks.ItemGroupCrossProduct"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;AssemblyFile&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"E:\My Documents\Visual Studio 2005\Projects\BlogProjects\CustomTasks\bin\Debug\CustomTasks.dll"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;1&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"foo2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;2&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;FooMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Foo&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar1"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;a&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Include&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"bar2"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;b&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;BarMetadata&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Bar&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroup&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"PrintFooAndBar"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroupCrossProduct&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemGroup1&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"@(Foo)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Metadata1&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"FooMetadata"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemGroup2&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"@(Bar)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Metadata2&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"BarMetadata"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

			&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Output&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskParameter&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CombinedItemGroup"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"CombinedItems"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;ItemGroupCrossProduct&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

		&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Message&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Importance&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"high"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Text&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"FooMetadata=%(CombinedItems.FooMetadata), BarMetadata=%(CombinedItems.BarMetadata)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;

	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;

&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Project&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;This post is getting too long, and I have other work to do, so - the code and an explanation of the Task wil have to wait until another day...&amp;nbsp; (I have to do something to keep you coming back)&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=741125" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category></item><item><title>Adding Custom Loggers to Team Build</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/08/30/adding-custom-loggers-to-team-build.aspx</link><pubDate>Wed, 30 Aug 2006 16:02:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:731642</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/731642.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=731642</wfw:commentRss><description>&lt;P&gt;Most of the magic in a Team Build is done using either (a) customized tasks, or (b) a customized &lt;EM&gt;logger&lt;/EM&gt;.&amp;nbsp;&amp;nbsp;Well, most of the &lt;EM&gt;build machine&lt;/EM&gt; magic - there's plenty of magic in the client,&amp;nbsp;the &lt;EM&gt;Application Tier&lt;/EM&gt;, and the&amp;nbsp;&lt;EM&gt;Data Tier&lt;/EM&gt;.&amp;nbsp; All right - even on the &lt;EM&gt;build machine&lt;/EM&gt; I suppose plenty of magic happens within MSBuild itself.&amp;nbsp; In any case, we should be able to agree that &lt;EM&gt;some &lt;/EM&gt;of the magic in a Team Build happens using customized tasks and loggers, right?&amp;nbsp; They're responsible for making&amp;nbsp;most of&amp;nbsp;the web service calls that populate the database with information about the build, interacting with source control and work item tracking, keeping track of the errors/warnings encountered during the build, etc.&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx" target=_blank mce_href="http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx"&gt;Yesterday&lt;/A&gt; we looked at using tasks to add customized build steps during a build.&amp;nbsp; Today I'd like to show you how to add a customized logger...&amp;nbsp; For more information on MSBuild loggers, check out &lt;A href="http://msdn2.microsoft.com/en-us/library/ms171470.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms171470.aspx"&gt;MSBuild Logging&lt;/A&gt;&amp;nbsp;on MSDN.&lt;/P&gt;
&lt;P&gt;Step 1.&amp;nbsp; Figure out why you want to add a logger.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I was thinking about this last night - would a Team Build user ever want to add a custom logger?&amp;nbsp; The IDC team, implementers of Team Build 1.0, have a couple of posts on different types of custom loggers:&lt;/P&gt;
&lt;P&gt;An &lt;A href="http://blogs.msdn.com/chaitanyacheruvu/archive/2005/09/13/464611.aspx" target=_blank mce_href="http://blogs.msdn.com/chaitanyacheruvu/archive/2005/09/13/464611.aspx"&gt;XML Logger&lt;/A&gt;.&amp;nbsp;&amp;nbsp;This might be useful for diagnostic purposes - it will show you every single event raised by MSBuild during the course of a build.&amp;nbsp; I wouldn't recommend it for &lt;EM&gt;large&lt;/EM&gt; builds, unless you feel like filling up your hard disk!&lt;/P&gt;
&lt;P&gt;An &lt;A href="http://blogs.msdn.com/gautamg/archive/2006/04/19/578967.aspx" mce_href="http://blogs.msdn.com/gautamg/archive/2006/04/19/578967.aspx"&gt;errors/warnings logger&lt;/A&gt; that creates log files &lt;EM&gt;per solution.&lt;/EM&gt;&amp;nbsp; This could be pretty useful if you are running into &lt;EM&gt;tons&lt;/EM&gt; of errors/warnings in your build and want to separate them out into more managable chunks (by default Team Build creates log files &lt;EM&gt;per configuration&lt;/EM&gt;).&lt;/P&gt;
&lt;P&gt;Neither of these seemed seemed particularly compelling to me, though - I could see wanting to use them once or twice, but not all the time.&amp;nbsp; How about this - out of the box TFS supports notifications on &lt;EM&gt;build completion&lt;/EM&gt; or on &lt;EM&gt;build quality change&lt;/EM&gt;.&amp;nbsp; For certain types of builds, though, one might want to send out notifications on &lt;EM&gt;build start&lt;/EM&gt;.&amp;nbsp; Right?&amp;nbsp; Right?&amp;nbsp;&amp;nbsp;Oh fine, it's not the most interesting thing in the world, but it's something...&lt;/P&gt;
&lt;P&gt;If you come up with other interesting reasons to write your own loggers, please let me know!&lt;/P&gt;
&lt;P&gt;Step 2.&amp;nbsp; You'll want to actually write&amp;nbsp;your custom logger.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;I'm not going to post the entire sample this time - just the relevant bit.&amp;nbsp; &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; CustomLogger : ILogger
{&lt;/PRE&gt;&lt;PRE&gt;    ...&lt;/PRE&gt;&lt;PRE&gt;    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; Initialize(IEventSource source)
    {
        source.BuildStarted += &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; BuildStartedEventHandler(HandleBuildStartedEvent);
    }

    &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; HandleBuildStartedEvent(Object sender, BuildStartedEventArgs args)
    {
        &lt;SPAN style="COLOR: #008000"&gt;// Write fancy email sending code here!&lt;/SPAN&gt;
    }&lt;/PRE&gt;&lt;PRE&gt;    ...
}
&lt;/PRE&gt;
&lt;P&gt;Step 3.&amp;nbsp; You'll need to tell MSBuild about your logger, using the &lt;STRONG&gt;/logger&lt;/STRONG&gt; command-line switch.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;One of the files created for each build type is &lt;EM&gt;TfsBuild.rsp&lt;/EM&gt;.&amp;nbsp; This is an &lt;A href="http://msdn2.microsoft.com/en-us/library/ms404301.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms404301.aspx"&gt;MSBuild response file&lt;/A&gt;, and can contain MSBuild.exe command-line switches.&amp;nbsp; Team Build will pass this file to MSBuild.exe whenever a build is started (for the given build type).&amp;nbsp; &lt;/P&gt;
&lt;P&gt;So - check out &lt;EM&gt;TfsBuild.rsp &lt;/EM&gt;from source control, add something like the following:&lt;/P&gt;
&lt;P&gt;/logger:CustomLogger,CustomLogger.dll&lt;/P&gt;
&lt;P&gt;...and check it back in.&lt;/P&gt;
&lt;P&gt;Step 4.&amp;nbsp; Make sure that your logger assembly is available during the build.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The easiest thing here is probably to add it to the same directory in source control as the &lt;EM&gt;TfsBuild.rsp&lt;/EM&gt; file you just modified - Team Build will then sync &lt;EM&gt;CustomLogger.dll&lt;/EM&gt; along with &lt;EM&gt;TfsBuild.proj&lt;/EM&gt;, &lt;EM&gt;TfsBuild.rsp&lt;/EM&gt;, and &lt;EM&gt;WorkspaceMapping.xml&lt;/EM&gt;.&amp;nbsp; In this case, you won't need to give a full path to the assembly in the rsp file, and the above example should just work.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=731642" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>Adding BuildSteps to Team Build through a Custom Task</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/08/29/adding-buildsteps-to-team-build-through-a-custom-task.aspx</link><pubDate>Tue, 29 Aug 2006 22:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:730447</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>21</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/730447.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=730447</wfw:commentRss><description>&lt;P&gt;Team Build displays &lt;EM&gt;Build Steps&lt;/EM&gt; in the build report form within Visual Studio.&amp;nbsp; By default, build steps are added at various points during the course of a build - while &lt;EM&gt;getting&lt;/EM&gt; sources (in the &lt;EM&gt;Get&lt;/EM&gt; task), &lt;EM&gt;compiling&lt;/EM&gt; solutions / projects, &lt;EM&gt;copying&lt;/EM&gt; files to the drop location, etc.&amp;nbsp; Team Build allows users to insert their own build steps using the publicly accessible &lt;EM&gt;BuildStore&lt;/EM&gt; web service - in particular, the &lt;EM&gt;AddBuildStep&lt;/EM&gt; and &lt;EM&gt;UpdateBuildStep&lt;/EM&gt; methods.&amp;nbsp; The following &lt;STRONG&gt;sample&lt;/STRONG&gt;&amp;nbsp;(I make no claims as to the awesomeness or lack thereof of this sample, etc.) &lt;EM&gt;TeamBuildTask&lt;/EM&gt; class&amp;nbsp;illustrates how this can be done:&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; System.Web.Services;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.Build.Framework;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Client;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Common;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.Build.Proxy;&lt;BR&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #808080"&gt;/// Summary description for Class1&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; MyNamespace&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; TeamBuildTask : ITask&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// Put real task logic in this method.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;True if task is successful, otherwise false.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; ExecuteInternal();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// Returns the name of the build step to be added for this task.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;Name of the build step to be added.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; GetBuildStepName();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// Returns the message of the build step to be added for this task - this is the&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// string displayed in the Team Build GUI.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;Message of the build step to be added.&amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;abstract&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; GetBuildStepMessage();&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// ITask implementation - BuildEngine property.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; IBuildEngine BuildEngine&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildEngine;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_buildEngine = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// ITask implementation - HostObject property.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; ITaskHost HostObject&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_hostObject;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_hostObject = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// The Url of the Team Foundation Server.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Required]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; TeamFoundationServerUrl&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_tfsUrl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_tfsUrl = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// The Uri of the Build for which this task is executing.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [Required]&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; BuildUri&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildUri;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_buildUri = &lt;SPAN style="COLOR: #0000ff"&gt;value&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// Lazy init property that gives access to the TF Server specified by TeamFoundationServerUrl.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; TeamFoundationServer Tfs&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (m_tfs == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (String.IsNullOrEmpty(TeamFoundationServerUrl))&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #008000"&gt;// Throw some exception.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_tfs = TeamFoundationServerFactory.GetServer(TeamFoundationServerUrl);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_tfs;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// Lazy init property that gives access to the BuildStore service of the TF Server.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;protected&lt;/SPAN&gt; BuildStore BuildStore&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (m_buildStore == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; m_buildStore = (BuildStore)Tfs.GetService(&lt;SPAN style="COLOR: #0000ff"&gt;typeof&lt;/SPAN&gt;(BuildStore));&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildStore;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// ITask implementation - Execute method.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;returns&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// True if the task succeeded, false otherwise.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/returns&amp;gt;&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; Execute()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; returnValue = &lt;SPAN style="COLOR: #0000ff"&gt;false&lt;/SPAN&gt;;&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddBuildStep();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; returnValue = ExecuteInternal();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;catch&lt;/SPAN&gt; (Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AddExceptionBuildStep(e);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;throw&lt;/SPAN&gt;;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;finally&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UpdateBuildStep(returnValue);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; returnValue;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; AddBuildStep()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStore.AddBuildStep(BuildUri, GetBuildStepName(), GetBuildStepMessage());&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P mce_keep="true"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; UpdateBuildStep(&lt;SPAN style="COLOR: #0000ff"&gt;bool&lt;/SPAN&gt; result)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStepStatus status = result ? BuildStepStatus.Succeeded : BuildStepStatus.Failed;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStore.UpdateBuildStep(BuildUri, GetBuildStepName(), DateTime.Now, status);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; AddExceptionBuildStep(Exception e)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStore.AddBuildStep(BuildUri, "&lt;SPAN style="COLOR: #8b0000"&gt;Exception&lt;/SPAN&gt;", e.Message);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; BuildStore.UpdateBuildStep(BuildUri, "&lt;SPAN style="COLOR: #8b0000"&gt;Exception&lt;/SPAN&gt;", DateTime.Now, BuildStepStatus.Failed);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;catch&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #008000"&gt;// Eat any exceptions.&lt;/SPAN&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; IBuildEngine m_buildEngine;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; ITaskHost m_hostObject;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; m_tfsUrl;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; m_buildUri;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; TeamFoundationServer m_tfs;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; BuildStore m_buildStore;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;To use this base class, just override the &lt;EM&gt;ExecuteInternal&lt;/EM&gt; method - put the actual task logic here.&amp;nbsp; Then override the &lt;EM&gt;GetBuildStepName&lt;/EM&gt; and &lt;EM&gt;GetBuildStepMessage&lt;/EM&gt; methods to specify the &lt;EM&gt;Name&lt;/EM&gt; of the build step (which serves as its ID and should therefore be reasonably unique) and the &lt;EM&gt;Message&lt;/EM&gt; of the build step (which will be the string displayed in the build report form).&lt;/P&gt;
&lt;P&gt;The &lt;EM&gt;Execute&lt;/EM&gt; method will add a build step (with the specified &lt;EM&gt;Name&lt;/EM&gt; and &lt;EM&gt;Message&lt;/EM&gt;) when task execution starts, and update the build step with the appropriate &lt;EM&gt;status&lt;/EM&gt; and &lt;EM&gt;time&lt;/EM&gt; when execution completes.&amp;nbsp; If an exception is thrown by the &lt;EM&gt;ExecuteInternal&lt;/EM&gt; method, an exception build step will be added (if possible) by the &lt;EM&gt;AddExceptionBuildStep &lt;/EM&gt;method.&lt;/P&gt;
&lt;P&gt;Note the &lt;EM&gt;TeamFoundationServerUrl&lt;/EM&gt; and &lt;EM&gt;BuildUri&lt;/EM&gt; properties.&amp;nbsp; These properties will need to be set for derived tasks to function properly, and can be easily set to the &lt;EM&gt;TeamFoundationServerUrl&lt;/EM&gt; and &lt;EM&gt;BuildURI&lt;/EM&gt; properties available during a Team Build (e.g. within &lt;EM&gt;TfsBuild.proj&lt;/EM&gt;).&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"BeforeBuild"&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;
	&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;SomeCustomTask&lt;/SPAN&gt; 
		&lt;SPAN style="COLOR: #ff0000"&gt;TeamFoundationServerUrl&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(TeamFoundationServerUrl)"&lt;/SPAN&gt;
		&lt;SPAN style="COLOR: #ff0000"&gt;BuildUri&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(BuildURI)"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;/&amp;gt;&lt;/SPAN&gt;
&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;/&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Target&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Happy building!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=730447" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/MSBuild/default.aspx">MSBuild</category><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item></channel></rss>