<?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 : Team Build V1</title><link>http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx</link><description>Tags: Team Build V1</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Another Method for using solution-specific binaries subdirectories</title><link>http://blogs.msdn.com/aaronhallberg/archive/2007/03/27/another-method-for-using-solution-specific-binaries-subdirectories.aspx</link><pubDate>Tue, 27 Mar 2007 17:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1964069</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/1964069.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=1964069</wfw:commentRss><description>&lt;P&gt;A problem that comes up over and over again (see forums posts &lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=731301&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=731301&amp;amp;SiteID=1"&gt;here&lt;/A&gt;, &lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=602187&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=602187&amp;amp;SiteID=1"&gt;here&lt;/A&gt;, etc.)&amp;nbsp;with Team Build v1 is that it is very difficult to compile individual solutions and/or individual projects within a solution into their own output directories.&amp;nbsp; I did a &lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2007/03/19/passing-custom-properties-to-individual-solutions-in-team-build.aspx" mce_href="http://blogs.msdn.com/aaronhallberg/archive/2007/03/19/passing-custom-properties-to-individual-solutions-in-team-build.aspx"&gt;post&lt;/A&gt;&amp;nbsp;last week on passing custom properties to individual solutions - one of the uses for this functionality is addressing this issue.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;A clever hack that addresses this issue was submitted to an internal Microsoft DL yesterday by Guido Pica, who works for Microsoft Consulting Services in Italy.&amp;nbsp; The idea is to use Team Build's built-in &lt;EM&gt;ConfigurationToBuild&lt;/EM&gt; logic to trick it into doing this work for you.&amp;nbsp; Here's Guido's solution in his own words:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Another quick way to get this is to &lt;B&gt;customize Solution Configurations&lt;/B&gt;:&lt;/P&gt;
&lt;P&gt;In Solution Configuration Manager, create a &lt;B&gt;new solution configuration&lt;/B&gt; (name it as you want the subfolder named ex.: FirstSolution, etc.) 
&lt;P&gt;Usually you want to &lt;B&gt;Copy from “Release” default&lt;/B&gt; configuration 
&lt;P&gt;&lt;B&gt;DESELECT the option to create project configuration&lt;/B&gt;, cause this should remain *&lt;B&gt;ONLY*&lt;/B&gt; a solution configuration, and should not be propagated to projects. 
&lt;P&gt;Then, in &lt;B&gt;TFSBuild.proj&lt;/B&gt;, add all custom solution configuration to be processed as &lt;B&gt;Flavors&lt;/B&gt;: 
&lt;P&gt;&amp;nbsp; &amp;lt;ItemGroup&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConfigurationToBuild Include="&lt;B&gt;FirstSolution&lt;/B&gt;|Mixed Platforms"&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FlavorToBuild&amp;gt;&lt;B&gt;FirstSolution&lt;/B&gt;&amp;lt;/FlavorToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PlatformToBuild&amp;gt;Mixed Platforms&amp;lt;/PlatformToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ConfigurationToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ConfigurationToBuild Include="&lt;B&gt;SecondSolution&lt;/B&gt;|Mixed Platforms"&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;FlavorToBuild&amp;gt;&lt;B&gt;SecondSolution&lt;/B&gt;&amp;lt;/FlavorToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;PlatformToBuild&amp;gt;Mixed Platforms&amp;lt;/PlatformToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ConfigurationToBuild&amp;gt; 
&lt;P&gt;&amp;nbsp; &amp;lt;/ItemGroup&amp;gt; 
&lt;P&gt;This way, the team build process &lt;B&gt;will try to compile each solution against each solution configuration&lt;/B&gt;, but having each solution just his own configuration, this will be &lt;B&gt;the only one really processed for that solution&lt;/B&gt;, skipping all the others and creating his own right subfolder. 
&lt;P&gt;Hope I been clear enough. &lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;The trick here is that the &lt;EM&gt;ConfigurationToBuild&lt;/EM&gt; item group in Team Build is expected to contain &lt;EM&gt;solution&lt;/EM&gt; configurations, and not &lt;EM&gt;project&lt;/EM&gt; configurations.&amp;nbsp; Solution configurations are essentially just a collection of project configurations, and critically can also specify whether or not individual projects get built at all.&amp;nbsp; So - the idea here is just to create several solution configurations which build only one project and then let Team Build do the work of putting the binaries into their own subdirectories.&amp;nbsp; Note that if you use "Any CPU" as the platform it won't even insert the bogus "Mixed Platforms" directory into the mix.&amp;nbsp; 
&lt;P&gt;This solution is only really helpful when: (a) you have just one solution and want to copy individual &lt;EM&gt;project&lt;/EM&gt; outputs into their own subdirectories, (b) you have a small number of projects, and (c) you don't have automated unit tests (tests are also run per configuration, which is unlikely to work here).&amp;nbsp; If your build meets these conditions, however, this approach can allow you to solve the custom subdirectory issue without having to override &lt;EM&gt;CoreCompile&lt;/EM&gt;, do any crazy machinations in the &lt;EM&gt;AfterDropBuild&lt;/EM&gt; target, etc.&amp;nbsp; I should also note once more that this sort of thing will be &lt;EM&gt;much&lt;/EM&gt; easier in Orcas, and shouldn't require any hacks like this. 
&lt;P&gt;Thanks to Guido for the nice idea!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1964069" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</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>Getting the Modified Files for a Team Build Build</title><link>http://blogs.msdn.com/aaronhallberg/archive/2007/01/11/getting-the-modified-files-for-a-team-build-build.aspx</link><pubDate>Fri, 12 Jan 2007 00:14:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1452156</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/1452156.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=1452156</wfw:commentRss><description>&lt;P&gt;I've had several people inquire recently about how to figure out which files have changed since the previous Team Build build...&amp;nbsp; In V1 there is no straightforward way to do this, unfortunately, though we plan to remedy that in the next version of Team Build.&amp;nbsp; For now, here is one approach - the basic idea is to do a &lt;EM&gt;preview&lt;/EM&gt; get prior to doing the actual get.&amp;nbsp; There are issues with this, of course - you might be interested in the list of &lt;EM&gt;changesets&lt;/EM&gt; rather than the list of files, for example; additional modifications might be made to source control between the preview and the actual get; you might want to get one of these lists &lt;EM&gt;without having to do an incremental get&lt;/EM&gt;; and so forth.&amp;nbsp; To a first approximation, however, this should do the trick.&lt;/P&gt;
&lt;P&gt;The approach I took was to impement a custom task derived from the TeamBuildTask I presented in an earlier &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; I didn't add a lot of bells and whistles here - none of the fancy Get properties are exposed (FileSpec, Version, RecursionType, etc.); only the target local filename is included for each item; etc.&amp;nbsp; If you want stuff like that, you'll have to add it yourself!&amp;nbsp; As always, I make no guarantees about the awesomeness of this sample code, etc.&amp;nbsp; In fact, I would appreciate any feedback on this one - I am in the middle of a bunch of stuff with my dev box and didn't even have a chance to test this one...&amp;nbsp; All I know for sure&amp;nbsp;is that it compiles!&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;using&lt;/SPAN&gt; Microsoft.TeamFoundation.VersionControl.Client;
&lt;SPAN style="COLOR: #0000ff"&gt;using&lt;/SPAN&gt; Microsoft.TeamFoundation.VersionControl.Common;

&lt;SPAN style="COLOR: #0000ff"&gt;namespace&lt;/SPAN&gt; CustomTasks
{
    &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; PreviewGet : TeamBuildTask
    {
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Mirrors the v1 Get task property.&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 Workspace
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_workspace;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_workspace = &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;/// Output property that contains the list of all deletes that will be performed by the Get task.&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; ITaskItem[] Deletes
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_deletes.ToArray();
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Output property that contains the list of all gets that will be performed by the Get task.&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; ITaskItem[] Gets
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_gets.ToArray();
            }
        }

        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// Output property that contains the list of all replaces that will be performed by the Get task.&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; ITaskItem[] Replaces
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_replaces.ToArray();
            }
        }

        &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 VersionControlServer 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; VersionControlServer VersionControlServer
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (m_versionControlServer == &lt;SPAN style="COLOR: #0000ff"&gt;null&lt;/SPAN&gt;)
                {
                    m_versionControlServer = (VersionControlServer)Tfs.GetService(&lt;SPAN style="COLOR: #0000ff"&gt;typeof&lt;/SPAN&gt;(VersionControlServer));
                }
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_versionControlServer;
            }
        }

        &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;GetPreview&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;Getting the list of files to be updated by the Get task...&lt;/SPAN&gt;";
        }

        &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;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()
        {
            Workspace workspace = VersionControlServer.GetWorkspace(Workspace, RepositoryConstants.AuthenticatedUser);

            &lt;SPAN style="COLOR: #0000ff"&gt;try&lt;/SPAN&gt;
            {
                VersionControlServer.Getting += VersionControlServer_Getting;
                workspace.Get(VersionSpec.Latest, GetOptions.Preview);
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;finally&lt;/SPAN&gt;
            {
                VersionControlServer.Getting -= VersionControlServer_Getting;
            }

            &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;/// Getting event handler.&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; VersionControlServer_Getting(&lt;SPAN style="COLOR: #0000ff"&gt;object&lt;/SPAN&gt; sender, GettingEventArgs e)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;switch&lt;/SPAN&gt; (e.Status)
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; OperationStatus.Deleting:
                    m_deletes.Add(&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; TaskItem(e.TargetLocalItem));
                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;

                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; OperationStatus.Getting:
                    m_gets.Add(&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; TaskItem(e.TargetLocalItem));
                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;

                &lt;SPAN style="COLOR: #0000ff"&gt;case&lt;/SPAN&gt; OperationStatus.Replacing:
                    m_replaces.Add(&lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; TaskItem(e.TargetLocalItem));
                    &lt;SPAN style="COLOR: #0000ff"&gt;break&lt;/SPAN&gt;;
            }
        }

        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; String m_workspace;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; VersionControlServer m_versionControlServer;
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt; m_gets = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt;();
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt; m_replaces = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt;();
        &lt;SPAN style="COLOR: #0000ff"&gt;private&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt; m_deletes = &lt;SPAN style="COLOR: #0000ff"&gt;new&lt;/SPAN&gt; List&amp;lt;ITaskItem&amp;gt;();
    }
}&lt;/PRE&gt;
&lt;P&gt;To use this task, make sure to run it before the actual Get task.&amp;nbsp; Something like the following should typically do the trick:&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;lt;&lt;/SPAN&gt;&lt;SPAN style="COLOR: #800000"&gt;Task&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"BeforeGet"&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;PreviewGet&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;Workspace&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"$(WorkspaceName)"&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;"Deletes"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Deletes"&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;"Gets"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Gets"&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;"Replaces"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;ItemName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Replaces"&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;PreviewGet&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;Task&lt;/SPAN&gt;&lt;SPAN style="COLOR: #0000ff"&gt;&amp;gt;&lt;/SPAN&gt;&lt;/PRE&gt;
&lt;P&gt;Note that this task should typically only be used when doing incremental gets / incremental builds (See my post &lt;A href="http://blogs.msdn.com/aaronhallberg/archive/2007/01/03/doing-an-incremental-get-in-team-build.aspx" mce_href="http://blogs.msdn.com/aaronhallberg/archive/2007/01/03/doing-an-incremental-get-in-team-build.aspx"&gt;here&lt;/A&gt;&amp;nbsp;to learn how to do an incremental get without also doing an incremental build), and will only function as advertised (i.e. provide a list of the changed files since the last build) when:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Your build does an incremental get, and&lt;/LI&gt;
&lt;LI&gt;You only use one build machine!&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;Additionally, if you use this task when retrieving many millions of files, you can imagine it causing your build process to run out of memory...&amp;nbsp; Use it with caution!&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1452156" width="1" height="1"&gt;</description><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>Team Build API: GetListOfBuilds</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/29/Team-Build-API_3A00_-GetListOfBuilds.aspx</link><pubDate>Fri, 29 Sep 2006 15:36:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:776866</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/776866.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=776866</wfw:commentRss><description>&lt;P&gt;In part two of my 35 part series, better know a Proxy, I'll be going over the&amp;nbsp;&lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getlistofbuilds.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getlistofbuilds.aspx"&gt;GetListOfBuilds&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;BuildStore&lt;/A&gt;&amp;nbsp;class in the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx"&gt;Microsoft.TeamFoundation.Build.Proxy&lt;/A&gt;&amp;nbsp;namespace).&amp;nbsp; &lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx"&gt;BuildData&lt;/A&gt;[] GetListOfBuilds(
	&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; teamProject,
	&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; buildType
)&lt;/PRE&gt;
&lt;P&gt;This method can be used to obtain information about all of the builds for a particular build type.&amp;nbsp; It takes two parameters - &lt;EM&gt;teamProject&lt;/EM&gt;, which specifies the team project the build type belongs to; and &lt;EM&gt;buildType&lt;/EM&gt;, which specifies the build type for which builds are retrieved.&amp;nbsp; It returns an array of &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx"&gt;BuildData&lt;/A&gt;&amp;nbsp;objects, which contain various details about the individual builds.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Here is an example custom task (based on the TeamBuildTask base class from an earlier &lt;A href="https://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx" mce_href="https://blogs.msdn.com/aaronhallberg/archive/2006/08/29/730447.aspx"&gt;post&lt;/A&gt;) that uses the GetListOfBuilds method to generate sequential build numbers.&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.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; SequentialBuildNumberGenerator : TeamBuildTask
    {
        &lt;SPAN style="COLOR: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/SPAN&gt;
        &lt;SPAN style="COLOR: #808080"&gt;/// The build number generated by the task.&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;string&lt;/SPAN&gt; BuildNumber
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;get&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;return&lt;/SPAN&gt; m_buildNumber;
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;set&lt;/SPAN&gt;
            {
                m_buildNumber = &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;SequentialBuildNumberGenerator&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;Generating a sequential build number.&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()
        {
            BuildData thisBuild = BuildStore.GetBuildDetails(BuildUri);

            BuildData[] allBuilds = BuildStore.GetListOfBuilds(thisBuild.TeamProject, thisBuild.BuildType);

            &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (allBuilds.Length == 1)
            {
                m_buildNumber = "&lt;SPAN style="COLOR: #8b0000"&gt;1&lt;/SPAN&gt;";
            }
            &lt;SPAN style="COLOR: #0000ff"&gt;else&lt;/SPAN&gt;
            {
                &lt;SPAN style="COLOR: #0000ff"&gt;int&lt;/SPAN&gt; maxBuildNumber = 0, curBuildNumber;

                &lt;SPAN style="COLOR: #0000ff"&gt;foreach&lt;/SPAN&gt; (BuildData build &lt;SPAN style="COLOR: #0000ff"&gt;in&lt;/SPAN&gt; allBuilds)
                {
                    &lt;SPAN style="COLOR: #008000"&gt;// All non integral build numbers, including the original number for the current build, will be ignored.&lt;/SPAN&gt;
                    &lt;SPAN style="COLOR: #0000ff"&gt;if&lt;/SPAN&gt; (Int32.TryParse(build.BuildNumber, &lt;SPAN style="COLOR: #0000ff"&gt;out&lt;/SPAN&gt; curBuildNumber))
                    {
                        maxBuildNumber = Math.Max(maxBuildNumber, curBuildNumber);
                    }
                }

                m_buildNumber = (maxBuildNumber + 1).ToString("&lt;SPAN style="COLOR: #8b0000"&gt;D&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; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; m_buildNumber;
    }
}
&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;"SequentialBuildNumberGenerator"&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;"BuildNumberOverrideTarget"&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;SequentialBuildNumberGenerator&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;Output&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TaskParameter&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"BuildNumber"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;PropertyName&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"BuildNumber"&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;SequentialBuildNumberGenerator&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;img src="http://blogs.msdn.com/aggbug.aspx?PostID=776866" width="1" height="1"&gt;</description><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>Team Build API:  GetBuildUri and GetBuildDetails</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/13/team-build-api-getbuilduri-and-getbuilddetails.aspx</link><pubDate>Wed, 13 Sep 2006 20:52:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:752406</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/752406.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=752406</wfw:commentRss><description>&lt;P&gt;As &lt;A href="http://blogs.msdn.com/buckh" mce_href="http://blogs.msdn.com/buckh"&gt;Buck Hodges&lt;/A&gt;&amp;nbsp;recently noted, some Team Build API documentation recently made it up onto &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx"&gt;MSDN&lt;/A&gt;.&amp;nbsp; Unfortunately, most (maybe all?&amp;nbsp; I haven't been through it all) of the topics are skeletons, with no real content.&amp;nbsp; I'll be trying to remedy this by posting fleshed out documentation, sometimes even with examples...&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Thus begins my 35 part series - better know a Proxy.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;First up - the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getbuilddetails.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getbuilddetails.aspx"&gt;GetBuildDetails&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;BuildStore&lt;/A&gt;&amp;nbsp;class in the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.aspx"&gt;Microsoft.TeamFoundation.Build.Proxy&lt;/A&gt;&amp;nbsp;namespace).&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx"&gt;BuildData&lt;/A&gt; GetBuildDetails (
	&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; buildUri
)&lt;/PRE&gt;
&lt;P&gt;This method can be used to obtain information about in-progress or completed builds, including their status, quality, and finish time.&amp;nbsp; It takes a single parameter, &lt;EM&gt;buildUri&lt;/EM&gt;, which is a string containing the full URI of a build - typically something like:&amp;nbsp; "vstfs://Build/Build/09012006_010101_000001".&amp;nbsp; It returns a &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.builddata.aspx"&gt;BuildData&lt;/A&gt;&amp;nbsp;object, which contains various details about the build.&lt;/P&gt;
&lt;P&gt;Of course, users do not typically know the Uri associated with an individual build, since it is not displayed in any of the standard Team Build GUI.&amp;nbsp; To come up with a meaningful example, therefore, we'll also have to cover the &lt;A href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getbuilduri.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/microsoft.teamfoundation.build.proxy.buildstore.getbuilduri.aspx"&gt;GetBuildUri&lt;/A&gt;&amp;nbsp;method.&lt;/P&gt;&lt;PRE&gt;&lt;SPAN style="COLOR: #0000ff"&gt;public&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; GetBuildUri (
	&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; teamProject,
	&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; buildNumber
)&lt;/PRE&gt;
&lt;P&gt;This method can be used to obtain a build's Uri given a Team Project and the build's Number.&amp;nbsp; These can readily be retrieved from the Team Build GUI, though the build &lt;EM&gt;number &lt;/EM&gt;is typically displayed as the build &lt;EM&gt;name&lt;/EM&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;Here is an example console application that takes in a Team Foundation Server URL, a Team Project, and a Build Number and displays the corresponding build's Uri, Status, Quality, and Finish Time.&amp;nbsp; &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.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; ConsoleApplication1
{
    &lt;SPAN style="COLOR: #0000ff"&gt;class&lt;/SPAN&gt; Program
    {
        &lt;SPAN style="COLOR: #0000ff"&gt;static&lt;/SPAN&gt; &lt;SPAN style="COLOR: #0000ff"&gt;void&lt;/SPAN&gt; Main(&lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt;[] args)
        {
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; tfsUrl = args[0];
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; teamProject = args[1];
            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; buildNumber = args[2];

            TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(tfsUrl);

            BuildStore buildStore = (BuildStore)tfs.GetService(&lt;SPAN style="COLOR: #0000ff"&gt;typeof&lt;/SPAN&gt;(BuildStore));

            &lt;SPAN style="COLOR: #0000ff"&gt;string&lt;/SPAN&gt; buildUri = buildStore.GetBuildUri(teamProject, buildNumber);

            BuildData buildData = buildStore.GetBuildDetails(buildUri);

            Console.WriteLine();
            Console.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;BuildUri     = &lt;/SPAN&gt;" + buildData.BuildUri);
            Console.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;BuildStatus  = &lt;/SPAN&gt;" + buildData.BuildStatus);
            Console.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;BuildQuality = &lt;/SPAN&gt;" + buildData.BuildQuality);
            Console.WriteLine("&lt;SPAN style="COLOR: #8b0000"&gt;FinishTime   = &lt;/SPAN&gt;" + buildData.FinishTime);
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;Of course, any real application along these lines would do some error checking, display a useful message when invalid arguments were supplied, etc.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=752406" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</category></item><item><title>Team Build and aspnet_compiler.exe</title><link>http://blogs.msdn.com/aaronhallberg/archive/2006/09/12/team-build-and-aspnet-compiler-exe.aspx</link><pubDate>Tue, 12 Sep 2006 17:11:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:750590</guid><dc:creator>aaronhallberg</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/aaronhallberg/comments/750590.aspx</comments><wfw:commentRss>http://blogs.msdn.com/aaronhallberg/commentrss.aspx?PostID=750590</wfw:commentRss><description>&lt;P&gt;It's funny how things come in bunches sometimes...&amp;nbsp; I had never heard of the issue discussed in this blog post as of a couple of days ago, but we have received two queries on the topic in the &lt;A href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=481&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowForum.aspx?ForumID=481&amp;amp;SiteID=1"&gt;Team Build forums&lt;/A&gt;&amp;nbsp;in the last few days.&amp;nbsp; (Here they are, if you are interested:&amp;nbsp; &lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=706973&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=706973&amp;amp;SiteID=1"&gt;One&lt;/A&gt;&amp;nbsp;and &lt;A href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=714861&amp;amp;SiteID=1" mce_href="http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=714861&amp;amp;SiteID=1"&gt;Two&lt;/A&gt;.&amp;nbsp; &lt;/P&gt;
&lt;P&gt;The issue deals with the compilation of websites, and particularly with *.aspx and *.ashx files (ashx files, by the way, are &lt;A href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhttphandlers.asp" mce_href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconhttphandlers.asp"&gt;HTTP handlers&lt;/A&gt;).&amp;nbsp; In particular, when these types of files are compiled the resultant files typically contain some bogus text (something like "This is a marker file generated by the precompilation tool, and should not be deleted!"), while all the actual logic ends up in the generated assembly.&amp;nbsp; For example, the command line:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&amp;gt; aspnet_compiler.exe -v /WebApplication1 -p C:\MyProjects\WebApplication1 C:\MyProjects\WebApplication1\PrecompiledWeb&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;...will compile the web application defined in directory C:\MyProjects\WebApplication1 into the directory C:\MyProjects\WebApplication1\PrecompiledWeb.&amp;nbsp; In addition to using &lt;A href="http://msdn2.microsoft.com/en-us/library/ms229863.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms229863.aspx"&gt;aspnet_compiler.exe&lt;/A&gt;&amp;nbsp;directly, MSBuild includes the &lt;A href="http://msdn2.microsoft.com/en-us/library/ms164291.aspx" mce_href="http://msdn2.microsoft.com/en-us/library/ms164291.aspx"&gt;AspNetCompiler task&lt;/A&gt;.&amp;nbsp; The following MSBuild project file has the same result as the example command-line:&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;"Build"&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;Target&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;Name&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"Build"&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;AspNetCompiler&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;VirtualPath&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"/WebApplication1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;PhysicalPath&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"C:\MyProjects\WebApplication1"&lt;/SPAN&gt; &lt;SPAN style="COLOR: #ff0000"&gt;TargetPath&lt;/SPAN&gt;=&lt;SPAN style="COLOR: #0000ff"&gt;"C:\MyProjects\WebApplication1\PrecompiledWeb"&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;Because Team Build typically compiles &lt;EM&gt;solutions&lt;/EM&gt; and not &lt;EM&gt;projects&lt;/EM&gt;, an additional complication is introduced with website projects.&amp;nbsp; By default, these projects have the &lt;STRONG&gt;-u&lt;/STRONG&gt; option selected for their compilation in their &lt;EM&gt;solution&lt;/EM&gt; property pages.&amp;nbsp; If you open up a solution containing a website project you should see a section that looks something like this:&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;Project("{&lt;EM&gt;Some GUID&lt;/EM&gt;}") = "WebApplication1", ".\WebApplication1\", "{&lt;EM&gt;Some GUID&lt;/EM&gt;}"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProjectSection(WebsiteProperties) = preProject&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.VirtualPath = "/WebApplication1"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.PhysicalPath = ".\WebApplication1\"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.TargetPath = "PrecompiledWeb\WebApplication1\"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.Updateable = "true"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.ForceOverwrite = "true"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.FixedNames = "true"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.AspNetCompiler.Debug = "True"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; VWDPort = "14091"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; DefaultWebSiteLanguage = "Visual C#"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EndProjectSection&lt;BR&gt;EndProject&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;Note the &lt;EM&gt;VirtualPath&lt;/EM&gt;, &lt;EM&gt;PhysicalPath&lt;/EM&gt;, and &lt;EM&gt;TargetPath&lt;/EM&gt; lines - these specify options to the AspNetCompiler task that we have already seen in the above example (and correspond to the &lt;STRONG&gt;-v&lt;/STRONG&gt;, &lt;STRONG&gt;-p&lt;/STRONG&gt;, and &lt;STRONG&gt;targetPath&lt;/STRONG&gt; options to aspnet_compiler.exe, respectively).&amp;nbsp; The rest of the lines with AspNetCompiler in them also correspond to AspNetCompiler task properties, and the &lt;EM&gt;Updateable&lt;/EM&gt; (sic) property is the one we care about for this post - it corresponds to the &lt;STRONG&gt;-u&lt;/STRONG&gt; option to aspnet_compiler.exe.&lt;/P&gt;
&lt;P&gt;With this option turned on, aspnet_compiler.exe keeps markup, including inline code, in all *.aspx and *.ashx files (and possibly others - I'm no expert in these matters) so that they can be modified after the site is deployed.&amp;nbsp; So - if you compile your website projects by using MSBuild to compile the &lt;EM&gt;solutions&lt;/EM&gt; that contain them:&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&amp;gt; msbuild.exe C:\MyProjects\WebApplication.sln&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;...your *.aspx and *.ashx files will be &lt;EM&gt;updatable&lt;/EM&gt; and will not be compiled.&amp;nbsp; Since Team Build typically compiles &lt;EM&gt;solutions&lt;/EM&gt;, builds done through Team Build will run into the same issue.&lt;/P&gt;
&lt;P&gt;So - to fix this issue, you can either manually edit your solution file (set the Debug.AspNetCompiler.Updateable value to "false" rather than "true", repeat for other configurations) in notepad, or you can edit it through the GUI by right-clicking on your website project, selecting &lt;EM&gt;Property Pages&lt;/EM&gt;, selecting the &lt;EM&gt;MSBuild Options&lt;/EM&gt; section, and unchecking the "&lt;EM&gt;Allow this precompiled site to be updated&lt;/EM&gt;" box.&amp;nbsp; &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=750590" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/aaronhallberg/archive/tags/Team+Build+V1/default.aspx">Team Build V1</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>