<?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>MSBuild Team Blog : Futures</title><link>http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx</link><description>Tags: Futures</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Recursion, and ItemGroups inside Targets</title><link>http://blogs.msdn.com/msbuild/archive/2007/04/13/recursion-and-itemgroups-inside-targets.aspx</link><pubDate>Fri, 13 Apr 2007 21:22:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:2118336</guid><dc:creator>msbuild</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/2118336.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=2118336</wfw:commentRss><description>&lt;P&gt;Greetings MSBuilders!&lt;/P&gt;
&lt;P&gt;An internal team (Office Live, I think) asked us how to make their build start up faster. Their traversal project at the root of their tree started like this:&lt;/P&gt;
&lt;P&gt;&amp;lt;Project xmlns="&lt;A href="http://schemas.microsoft.com/developer/msbuild/2003" mce_href="http://schemas.microsoft.com/developer/msbuild/2003"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/A&gt;"&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;ItemGroup&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Databases\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\External\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Library\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Tools\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Utils\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\WebControls\**\*.csproj"/&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DotNetProjects Include="$(BuildPath)\**\*.csproj" Exclude="@(ExcludedDirectory)"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;NativeProjects Include="$(BuildPath)\**\*.CPPproj" Exclude="@(ExcludedDirectory)" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WebProjects Include="$(BuildPath)\**\*.webproj" Exclude="@(ExcludedDirectory)" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;WixProjects Include="$(BuildPath)\**\*.wixproj" Exclude="@(ExcludedDirectory)" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;LocProjects Include="$(BuildPath)\**\*.locproj" Exclude="@(ExcludedDirectory)" /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/ItemGroup&amp;gt;&lt;/P&gt;
&lt;P&gt;...&lt;/P&gt;
&lt;P&gt;The way they had this set up, was their developers to run a shared batch file at any point in the tree. It would set an environment variable BuildPath to the current directory, and then build this shared traversal project. The traversal project would find every project below the current directory, and build it. This allowed them to avoid putting traversal projects at every point in the tree and remember to add new projects to them. But the wildcard evaluation&amp;nbsp;was slow.&lt;/P&gt;
&lt;P&gt;They changed it to this &lt;/P&gt;
&lt;P&gt;&amp;lt;Project InitialTargets="FindProjects" xmlns="&lt;A href="http://schemas.microsoft.com/developer/msbuild/2003" mce_href="http://schemas.microsoft.com/developer/msbuild/2003"&gt;http://schemas.microsoft.com/developer/msbuild/2003&lt;/A&gt;"&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;lt;ItemGroup&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Databases\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\External\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Library\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Tools\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\Utils\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\WebControls\**\*.csproj"/&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;AllProjects Include="$(BuildPath)\**\*.*proj" Exclude="@(ExcludedDirectory)" /&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;/ItemGroup&amp;gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;lt;Target Name="FindProjects"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ItemGroup&amp;gt;&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;lt;DotNetProjects Include="@(AllProjects)" Condition="'%(AllProjects.Extension)'=='.csproj'" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;NativeProjects Include="@(AllProjects)" Condition="'%(AllProjects.Extension)'=='.cppproj'" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;WebProjects Include="@(AllProjects)" Condition="'%(AllProjects.Extension)'=='.webproj'" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;WixProjects Include="@(AllProjects)" Condition="'%(AllProjects.Extension)'=='.wixproj'" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;LocProjects Include="@(AllProjects)" Condition="'%(AllProjects.Extension)'=='.locproj'" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ItemGroup&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &amp;lt;/Target&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp; &lt;BR&gt;&amp;nbsp;&amp;nbsp; ...&lt;/P&gt;
&lt;P&gt;With the old approach, this took 12.6s to list all projects in the tree to the console. With the new approach target it takes 3.1s to list all projects in the tree. Of course, most of the time, the build starts lower in the tree, so the time taken is smaller. I wonder if they could have reduced the ExcludedDirectory line to just one line to make it faster still?&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ExcludedDirectory Include="$(BuildPath)\**\Common\**\*.csproj"/&amp;gt;&lt;/P&gt;
&lt;P&gt;This example illustrates a new feature you'll find in Orcas Beta 1 -- ItemGroup and PropertyGroup are now allowed inside Targets. (In MSBuild v2.0 you would have to use CreateItem and CreateProperty instead, which were ugly and inconsistent.) I moved the ItemGroup inside the Target here, so that I could use batching to exclude specific extensions from each list.&lt;/P&gt;
&lt;P&gt;I'll be blogging in detail about this new syntax in a future post.&lt;/P&gt;
&lt;P&gt;Have fun!&lt;BR&gt;[ Author: Dan, MSBuild developer ]&lt;/P&gt;
&lt;P mce_keep="true"&gt;Update: They couldn't have a single ExcludedDirectory line as I suggested above, because one directory in that tree (Common\Platform) needed to be included. So they now do this:&lt;/P&gt;
&lt;P mce_keep="true"&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;AllProjectFiles Include="$(BuildPathActual)\**\*.*proj" Exclude="$(BuildPathActual)\**\Common\**\*.csproj" /&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--We need to re-include the platform directory, so that it gets built--&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;AllProjectFiles Include="$(BuildPathActual)\**\Common\Platform\**\*.csproj"/&amp;gt;&lt;/P&gt;
&lt;P&gt;Which takes it down from 11 to 3 traversals.&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=2118336" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Dan+Moseley/default.aspx">Dan Moseley</category></item><item><title>Multi-Targeting : How does it work?</title><link>http://blogs.msdn.com/msbuild/archive/2006/11/15/multi-targeting-how-does-it-work.aspx</link><pubDate>Wed, 15 Nov 2006 04:30:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:1079050</guid><dc:creator>msbuild</dc:creator><slash:comments>15</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/1079050.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=1079050</wfw:commentRss><description>&lt;P&gt;So in my &lt;A class="" href="http://blogs.msdn.com/msbuild/archive/2006/11/03/msbuild-orcas-and-multi-targeting.aspx" mce_href="http://blogs.msdn.com/msbuild/archive/2006/11/03/msbuild-orcas-and-multi-targeting.aspx"&gt;last post&lt;/A&gt;, I described the multi-targeting feature at a very high level. I discussed how there will be three frameworks that you can build "for", and how there will be two toolsets - i.e. .NET Framework 2.0 / MSBuild 2.0 toolset, and the .NET Framework 3.5 / MSBuild 3.5 toolset.&lt;/P&gt;
&lt;P&gt;Recall that&amp;nbsp;the capability we have added to MSBuild as a part of this feature is the ability for you to take a project, and build it using either toolset. MSBuild 3.5 supports a new command line parameter known as ToolsVersion that allows you to specify which toolset you want to build using, and is invoked as shown:&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;
&lt;P class=MsoNormal style="MARGIN: 0in 0in 10pt"&gt;&lt;SPAN style="FONT-SIZE: 10pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'"&gt;msbuild WindowsApplication1.csproj /ToolsVersion:3.5&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;/SPAN&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial&gt;&lt;FONT size=2&gt;&lt;FONT face="Courier New"&gt;ToolsVersion &lt;/FONT&gt;is the parameter that you use to force a project to build using a specific toolset. There are only two toolsets available out of the box, but you can also set up "custom" toolsets depending on your needs, and MSBuild can be used to build projects using those that you have defined. More on that later.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial size=2&gt;So, the next question obviously is, what happens when you build a project using a specific ToolsVersion, and what are the mechanics in action behind the scenes?&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial size=2&gt;To understand this, we have to know a bit about how our project files are described. A standard Visual Studio&amp;nbsp;managed&amp;nbsp;project includes an import statement like the one shown below that is responsible for pulling in all the MSBuild / managed code build process into the project:&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT color=#0000ff size=2&gt;
&lt;P&gt;&amp;lt;&lt;/FONT&gt;&lt;FONT color=#800000 size=2&gt;Import&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; &lt;/FONT&gt;&lt;FONT color=#ff0000 size=2&gt;Project&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;=&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;$(MSBuildBinPath)\Microsoft.CSharp.targets&lt;/FONT&gt;&lt;FONT size=2&gt;"&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt; /&amp;gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;In MSBuild 2.0 (Visual Studio 2005 release), &lt;FONT face="Courier New" color=#0000ff&gt;$(MSBuildBinPath) &lt;/FONT&gt;evaluated to the location of MSBuild 2.0, i.e. the .NET Framework 2.0 install path. In order to import the new version of &lt;STRONG&gt;Microsoft.CSharp.targets&lt;/STRONG&gt;, naturally this needs to change to location of Microsoft.CSharp.targets that ship along with MSBuild 3.5. So in essence, specifying a ToolsVersion value at the command line is essentially equivalent to choosing from a predefined set of valid values for $(MSBuildBinPath). So specifying a ToolsVersion of 2.0 will cause MSBuildBinPath to evaluate to the .NET Framework 2.0 install path, and 3.5 will cause it to evaluate to the .NET Framework 3.5 install path, etc. Additionally, the targets that ship in MSBuild 3.5 include enhancements to the build process that will cause it to use the new set of compilers and other tasks.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;&lt;STRONG&gt;MSBuildBinPath&lt;/STRONG&gt;&amp;nbsp;has also been "deprecated"&amp;nbsp;in&amp;nbsp;favor of &lt;STRONG&gt;MSBuildToolsPath&lt;/STRONG&gt; - new projects created will use MSBuildToolsPath since that is a better name for what the property represents.&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;Allowing you to specify which toolset to use is only half the story. Multi-Targeting is also about building your code "targeting" a specific version of the framework - for instance, you might want to build your app only so that it relies on 2.0 assemblies and not on any 3.0 or 3.5 assemblies. This is done using another lever that is available&amp;nbsp;via your project file. You can include a property in your project file known as &lt;STRONG&gt;TargetFrameworkVersion&lt;/STRONG&gt; that specifies which target framework you are building your application for. TargetFrameworkVersion can either be &lt;STRONG&gt;v2.0&lt;/STRONG&gt;,&lt;STRONG&gt; v3.0&lt;/STRONG&gt; or&lt;STRONG&gt; v3.5&lt;/STRONG&gt; - this means that if you are referencing assemblies that are not in a given TargetFrameworkVersion, then you will get errors/warnings at build time that will tell you so. This prevents you from taking on dependencies that will surprise you when you later turn around and try to deploy your app in a more tightly controlled environment that might only have a smaller subset of the three frameworks installed. Since TargetFrameworkVersion is a new concept, you need to be using ToolsVersion 3.5 in order to succefully build projects while honoring the TargetFrameworkVersion property. &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;This is a confusing topic, so please feel free to ask questions, and provide feedback so that we can help clarify anything on the subject. &lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;FONT face=Arial color=#000000 size=2&gt;[ Author : Faisal Mohamood ]&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face=Arial size=2&gt;&lt;SPAN style="FONT-SIZE: 11pt; LINE-HEIGHT: 115%; FONT-FAMILY: 'Courier New'; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-ansi-language: EN-US; mso-fareast-language: EN-US; mso-bidi-language: AR-SA"&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=1079050" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Faisal+Mohamood/default.aspx">Faisal Mohamood</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/MSBuild+in+Visual+Studio/default.aspx">MSBuild in Visual Studio</category></item><item><title>New Feature Feedback Request: /IgnoreProjectExtensions - A new command-line switch</title><link>http://blogs.msdn.com/msbuild/archive/2006/03/24/559547.aspx</link><pubDate>Fri, 24 Mar 2006 04:53:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:559547</guid><dc:creator>msbuild</dc:creator><slash:comments>11</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/559547.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=559547</wfw:commentRss><description>&lt;P&gt;I've been in a cave just getting things done toward our Orcas release. But there's not much a Program Manager can do without going back to their customers :) So here I am.&lt;/P&gt;
&lt;P&gt;So here's the scoop.&amp;nbsp; We've been debating internally about a&amp;nbsp;new command line switch on msbuild.exe for sometime now. I am not certain that we've come to the right answer ourselves&amp;nbsp;- but&amp;nbsp;customers give us&amp;nbsp;the final word - so tell us what you think about the following:&lt;/P&gt;
&lt;P&gt;Today, when you invoke msbuild.exe from the command line and don't specify any project files as arguments, then we do some auto inferral and scanning and decide if we should build anything. If we find either a msbuild project (anything that has an extension of *proj) or a solution file (.sln),&amp;nbsp;we will build&amp;nbsp;either the project or the solution as long as there is only one solution or one project in the directory. If there is a solution and a project, we will give preference to the solution.&amp;nbsp; If there's more than one project or more than one solution, we issue an error message because we can't decide which one to build.&lt;/P&gt;
&lt;P&gt;Now, what if you wanted to pick the project instead when a solution is encountered, but didn't want to specify the project name as an argument? Old habits die hard - when building Visual Studio code, we are used to issuing a single command to build the current project instead of having to specify the project name that we are specifying. So the only way to get this to work was to think of supporting a /IgnoreProjectExtensions switch that has the following usage model:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT face="Courier New"&gt;msbuild /IgnoreProjectExtensions:vcproj;sln&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Now how exactly does this simplify our lives, you ask?&amp;nbsp; We would use a .rsp file that sits next to msbuild.exe that we will add in our environment - after which, simply issuing msbuild will ignore what we ask it to ignore in the solution file.&lt;/P&gt;
&lt;P&gt;What do you think? Something you'd find useful?&amp;nbsp; Or would you rather prefer the "clean" command line interface that we have today, and don't think this switch is worth it? The internal debate is about the fact that we don't want to add command line switch after command line switch to msbuild.exe as we please unless there is a specific customer scenario that we are trying to enable.&amp;nbsp; But DevDiv build is also one of our biggest internal customers :) So we look to you to tell us!&lt;/P&gt;
&lt;P&gt;Cheers.&lt;/P&gt;
&lt;P&gt;[Author: Faisal Mohamood]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=559547" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Faisal+Mohamood/default.aspx">Faisal Mohamood</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Sprint 12 review</title><link>http://blogs.msdn.com/msbuild/archive/2006/02/01/522576.aspx</link><pubDate>Thu, 02 Feb 2006 01:31:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:522576</guid><dc:creator>msbuild</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/522576.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=522576</wfw:commentRss><description>&lt;p&gt;This morning we had our review of work done during Sprint 12. As you hopefully recall we run two sprints simultaneously: one focused on our conversion effort and one focused on platform investments.&lt;/p&gt;
&lt;p&gt;Sumedh got stuck in traffic on &lt;a href="http://www.wsdot.wa.gov/traffic/seattle/flowmaps/bridges.htm"&gt;520&lt;/a&gt;, so Faisal stepped in to drive the proceedings. Faisal handled it well, applause applause. And now, on to the review details...&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Converting Visual Studio Builds (conversion):&lt;/strong&gt; We converted three more trees, with one more currently under code review (we can't call the one under code review done because for us "done" means checked-in). At this point every team in Visual Studio is either done or in the process of converting except one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tool for Infering Project-to-Project References (conversion):&lt;/strong&gt; As part of our conversion effort we want to ensure that all dependencies between trees are explicitly stated through project-to-project (P2P) references. Dan worked on a tool that will go and automatically add P2P references to converted projects. He gave a demo during the review, and it was super sweet!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Multi-Proc Development Work (platform): &lt;/strong&gt;Vlad and Sumedh spent most of the sprint working on implementing the beginnings of multi-processor support in the engine. They did a demo of what they have working so far, and it's so cool to see the beginnings showing up. We're a long way from having something that's useful outside of concocted projects, but progress is being made. Here's a picture of what the demo looked like:&lt;/p&gt;&lt;img src="http://msbuild.members.winisp.net/images/multiproc.jpg"/&gt; 
&lt;p&gt;&lt;strong&gt;Fixing Bugs:&lt;/strong&gt; This wasn't part of either sprint, but was something we had to do as part of a larger effort by Visual Studio. We need to keep our bugs at or near zero, and since we've been receiving new bugs through the &lt;a href="http://lab.msdn.microsoft.com/productfeedback/default.aspx"&gt;MSDN Product Feedback Center&lt;/a&gt; we had some work to do.&lt;/p&gt;
&lt;p&gt;[ Author: Neil Enns ]&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=522576" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Neil+Enns/default.aspx">Neil Enns</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Agile+Development/default.aspx">Agile Development</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Platform Sprint 11</title><link>http://blogs.msdn.com/msbuild/archive/2006/01/05/509778.aspx</link><pubDate>Thu, 05 Jan 2006 22:29:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:509778</guid><dc:creator>msbuild</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/509778.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=509778</wfw:commentRss><description>&lt;P&gt;The new year got off to a good start for us with the MSBuild Platform Sprint 11 Backlog selection meeting.&amp;nbsp;Platform Sprint 10 was focused mostly on getting our Compatibility story in place.&amp;nbsp;All of the work from the last sprint in terms of compatibility has been checked in and is now in use.&lt;/P&gt;
&lt;P&gt;This means that we can finally get to the good stuff in Platform Sprint 11.&amp;nbsp;Our sprint goal for this sprint is to deliver a working version of multi-proc build capability.&amp;nbsp;Needless to say, everyone on the sprint is excited about this and we are looking forward to the end of the month to see where we stand.&amp;nbsp;I believe that we will have good parts of the multi-proc functionality working at the end of the sprint, and here's why:&lt;/P&gt;
&lt;P&gt;Over the past sprints, we have been thinking a lot about the design of the system - like we discussed &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/11/09/491044.aspx"&gt;here&lt;/A&gt; and &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/10/14/481171.aspx"&gt;here&lt;/A&gt;.&amp;nbsp;It is time now to start thinking in terms of real implementation milestones - and to that end we decided to think strictly&amp;nbsp;in terms of &lt;A href="http://www.extremeprogramming.org/rules/userstories.html"&gt;"User Stories"&lt;/A&gt;.&amp;nbsp;So, everything that has to do with multi-proc that went on our backlog were real stories that would make sense to you from a customer standpoint, as opposed to items that are more closely aligned with the design or the implementation of the system.&amp;nbsp;For instance, the simplest user story in our case was&lt;EM&gt; "Build two simple, independent projects in parallel, with no logging support, no disk-bound tasks"&lt;/EM&gt;.&amp;nbsp;You can think of the simple projects as those that have a single target, and a single Message task.&amp;nbsp;That really is our first customer story for multi-proc.&amp;nbsp;We build successively on individual stories till we eventually get to a fully featured multi-proc build functionality.&lt;/P&gt;
&lt;P&gt;Of course there are a lot of other activities going on in this sprint as well.&amp;nbsp;We are working on handful of bugs that we could not get to during the tail end of Whidbey.&amp;nbsp;We are also investing in QA work so that we are able to deliver at an even higher level of quality during Orcas.&lt;/P&gt;
&lt;P&gt;I couldn't have asked for a better start with the new year.&amp;nbsp;I am highly optimistic of everything that is to come in the following months.&amp;nbsp;In the meantime, I encourage you to log any issues you run into with MSBuild via the &lt;A href="http://lab.msdn.microsoft.com/productfeedback/"&gt;MSDN Product Feedback Center&lt;/A&gt; so that we can consider them as bug fixes during the current Platform Sprint 11, or the subsequent one.&lt;/P&gt;
&lt;P&gt;[ Author: Faisal Mohamood ]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=509778" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Faisal+Mohamood/default.aspx">Faisal Mohamood</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Agile+Development/default.aspx">Agile Development</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Sprint 10 Review</title><link>http://blogs.msdn.com/msbuild/archive/2005/12/09/501849.aspx</link><pubDate>Fri, 09 Dec 2005 20:55:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:501849</guid><dc:creator>msbuild</dc:creator><slash:comments>0</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/501849.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=501849</wfw:commentRss><description>&lt;P&gt;Today we're holding our &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/11/28/497597.aspx"&gt;Sprint 10&lt;/A&gt; review. If you recall we do sprints for both dogfooding support and platform work. Here's a recap of what we accomplished in the last month.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dogfooding&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Six more teams within Visual Studio completed converting to MSBuild 
&lt;LI&gt;We completed our first integration of all the converted branches into the parent branch of our build process. If this sounds messy, that's because it is *grin*. 
&lt;LI&gt;Prefix support is checked in! 
&lt;LI&gt;Our dogfood builds now support IDL to TLB to meta assembly generation 
&lt;LI&gt;Proper support for build phases natively with MSBuild .targets files (this was all done with pair programming) 
&lt;LI&gt;Cleaned up build traversal and clean logic 
&lt;LI&gt;Documentation for Managed C++ builds 
&lt;LI&gt;Unit tests are now in place for dogfood .targets files&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Platform&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;All compatibility tests are written! This includes targets, shipped tasks and loggers, source code/APIs, command-line build, and solution builds. Since this is all we set out to do for platform in this sprint, I'd say we did pretty well. 
&lt;LI&gt;We started to engage with other teams such as FxCop, VB, and TeamBuild so we can understand our compatibility testing requirements there.&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;Sprint 11 will start in January when everyone is back from vacation.&lt;/P&gt;
&lt;P&gt;[ Author: Neil Enns ]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=501849" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Neil+Enns/default.aspx">Neil Enns</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Agile+Development/default.aspx">Agile Development</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Sprint 9 Review</title><link>http://blogs.msdn.com/msbuild/archive/2005/11/11/491890.aspx</link><pubDate>Fri, 11 Nov 2005 22:43:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:491890</guid><dc:creator>msbuild</dc:creator><slash:comments>415</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/491890.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=491890</wfw:commentRss><description>&lt;P&gt;It’s been about a month since we last talked about Sprint 9, and it’s time for an update. If you recall, the MSBuild team was planning on two parallel sprints: one for &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/10/04/477046.aspx"&gt;platform investigations&lt;/A&gt; and one to support &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/10/04/477043.aspx"&gt;internal dogfooding efforts&lt;/A&gt;. Last Friday marked the end of the sprints, and on Monday we held our sprint review. Here’s a recap of what we accomplished.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;Dogfooding Sprint&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Managed C++ Targets:&lt;/STRONG&gt; We completed the authoring of .targets files for building Managed C++ code that makes up Visual Studio, including support for managed resources and asmmeta generation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Conversion Support:&lt;/STRONG&gt; A large part of the sprint was supporting a very active internal conversion alias. With so many teams making forward progress on converting their builds to use MSBuild we wound up answering a lot of questions. We now have approximately 40% of Visual Studio building with MSBuild.&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;Platform Sprint&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Multi-proc scenarios:&lt;/STRONG&gt; We agreed on our key scenarios for enabling multi-processor support.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Core design docs:&lt;/STRONG&gt; Design documents were written and reviewed for many of the core pieces of our multi-processor support.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dogfooding roadmap:&lt;/STRONG&gt; Since dogfooding MSBuild technology is critical to what we do, we’ve already prepared a plan for how we’ll roll out multi-processor support to our build lab once it’s usable.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Partner engagement:&lt;/STRONG&gt; We met with a wide range of teams to discuss our multi-processor work, including teams that want the functionality as well as teams that have technologies that could help us in our implementation. As part of this engagement we also &lt;a href="http://blogs.msdn.com/msbuild/archive/2005/11/09/491044.aspx"&gt;posted to our blog&lt;/A&gt; about some of our Visual Studio integration concerns.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Compatibility tests:&lt;/STRONG&gt; We successfully reviewed and signed off on our compatibility test plan, and wrote compatibility tests for project, binary, and add-in compatibility verification. We also moved numerous test suites from our old test system to live directly in our developer code branches. This makes our tests vastly more portable between machines, and simplifies running them in conjunction with unit tests.&lt;/P&gt;
&lt;P&gt;That’s a quick wrap-up of what happened in the last month. Our next sprints will also run in parallel, and planning starts today. The sprints start next Monday, the 14th, and we’ll post the backlog as soon as we have it.&lt;/P&gt;
&lt;P&gt;[ Author: Neil Enns ]&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=491890" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Neil+Enns/default.aspx">Neil Enns</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Agile+Development/default.aspx">Agile Development</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Parallelizing Visual Studio solutions</title><link>http://blogs.msdn.com/msbuild/archive/2005/11/09/491044.aspx</link><pubDate>Thu, 10 Nov 2005 01:50:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:491044</guid><dc:creator>msbuild</dc:creator><slash:comments>4</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/491044.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=491044</wfw:commentRss><description>&lt;P&gt;One of the MSBuild Team’s scenarios for multi-proc builds is the automatic parallelization of Visual Studio solutions. For this scenario, we want Visual Studio to automatically parallelize all “independent” projects, and serialize all “dependent” ones.&lt;/P&gt;
&lt;P&gt;The key here is the separation of projects into the “independent” and “dependent” buckets. The separation is entirely based on project-to-project references and the ordering of projects in the “Project Dependencies” dialog. If the dependencies are not set up correctly, Visual Studio may end up building some dependent projects in parallel and thus break the build.&lt;/P&gt;
&lt;P&gt;Visual C++ (VC) projects in Visual Studio 2005 have already adopted the “parallel by default” model. For any solution that contains VC projects, Visual Studio automatically builds the independent projects in parallel. For consistency with VC projects, we are thinking of adopting the same model for managed projects (C#, VB and J#), and reusing the same Visual Studio mechanisms for parallelism.&lt;/P&gt;
&lt;P&gt;It is not clear to us, however, how many solutions this will negatively affect. If VS 2005 solutions that contain managed projects do not have their project dependencies set up correctly, when these solutions are opened in the next version of VS, their builds will break when they are automatically built in parallel. While this would not be ideal, the fix, of course, would be to update the project dependencies.&lt;/P&gt;
&lt;P&gt;There are two ways to add project dependencies to the solution: project-to-project references (&lt;A href="http://msdn2.microsoft.com/en-us/library/7314433t.aspx"&gt;http://msdn2.microsoft.com/en-us/library/7314433t.aspx&lt;/A&gt;), or project build dependencies (&lt;A href="http://msdn2.microsoft.com/en-us/library/et61xzb3"&gt;http://msdn2.microsoft.com/en-us/library/et61xzb3&lt;/A&gt;). Setting up a project build dependency ensures the dependent project is built after the projects it depends on. Adding a project-to-project reference additionally passes the output assembly of the referenced project as a reference to the compiler while building the referencing project. (Note that VS 2005 allows adding a project-to-project reference to a project with an exe output.)&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://msbuild.members.winisp.net/images/project_dependencies.jpg"&gt;&lt;/P&gt;
&lt;P&gt;We are planning to use more formal means to gather data on real-world solutions, but in the meantime, we would appreciate your thoughts on this issue. You can add a comment to this blog entry, or send email to &lt;A href="mailto:msbuild@microsoft.com"&gt;msbuild@microsoft.com&lt;/A&gt;.&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;[ Author: Sumedh Kanetkar ]&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=491044" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Sumedh+Kanetkar/default.aspx">Sumedh Kanetkar</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item><item><title>Parallel builds scenarios and implementation ideas</title><link>http://blogs.msdn.com/msbuild/archive/2005/10/14/481171.aspx</link><pubDate>Fri, 14 Oct 2005 21:19:00 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:481171</guid><dc:creator>msbuild</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/msbuild/comments/481171.aspx</comments><wfw:commentRss>http://blogs.msdn.com/msbuild/commentrss.aspx?PostID=481171</wfw:commentRss><description>&lt;P&gt;The MSBuild Team has started thinking about adding multi-proc support to the MSBuild engine. Currently MSBuild is single-threaded and does not take advantage of any opportunities for parallel processing during a build. However, most builds inherently have chunks of work that can be done concurrently. By parallelizing these independent chunks of work we aim to reduce the total build time for all builds, large and small.&lt;/P&gt;
&lt;P&gt;To enable parallel builds, we believe we need to support the following scenarios:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Ability to build a large tree of projects in parallel – we call this the “build lab” scenario. In this scenario multiple projects are built concurrently. 
&lt;LI&gt;Ability to build a Visual Studio solution in parallel. Solutions in Visual Studio can contain multiple projects, and even for simple solutions we should be able to support parallel builds. In this scenario, the independent projects are built concurrently, while the dependent ones are serialized. 
&lt;LI&gt;Ability to build multiple files in a project concurrently. Some projects have lots of files that need to be operated on by a single tool one-by-one. In this scenario, the tool is invoked concurrently on all the files.&lt;/LI&gt;&lt;/OL&gt;
&lt;P&gt;We currently believe that scenarios (1) and (2) would provide the “biggest bang for the buck” in build performance. However, MSBuild is a general build orchestration engine and we know some of our customers build things other than source code. For many of these customers, supporting (3) would offer them significant benefits. This is particularly the case if the build calls into older tools that don’t support multi-processor machines natively. As a result, we believe we also need to look into supporting the parallelization of tasks within a build.&lt;/P&gt;&lt;IMG src="http://msbuild.members.winisp.net/images/multiproc_whiteboard.jpg"&gt; 
&lt;P&gt;In addition to thinking about scenarios, we're working on implementation designs (as you can see from the above picture!). On the implementation side the build mechanism we are considering is completely declarative. The MSBuild engine will not make any attempt to determine what can be parallelized. Instead, we will instead introduce parallelization “constructs” in the file format that will allow a project or targets file author to indicate what can and cannot be parallelized.&lt;/P&gt;
&lt;P&gt;For Visual Studio solutions, the parallelization will be automatic in a sense. The target files we will ship will allow all independent projects in a solution to be parallelized. As long as the dependencies are correctly expressed through project-to-project references, or through the “Project Dependencies” dialog, the build will parallelize correctly.&lt;/P&gt;
&lt;P&gt;Now is your chance to give us feedback! What do your builds look like? How would the above three points of parallelization improve your build performance? What do you think about our plans to introduce new construcuts? Let us know by replying to this post, or send us email at &lt;A href="mailto:msbuild@microsoft.com"&gt;msbuild@microsoft.com&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;[ Author: Sumedh Kanetkar ] &lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=481171" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/msbuild/archive/tags/Sumedh+Kanetkar/default.aspx">Sumedh Kanetkar</category><category domain="http://blogs.msdn.com/msbuild/archive/tags/Futures/default.aspx">Futures</category></item></channel></rss>