<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://consultingblogs.emc.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">James Dawson's Blog (2005 - 2011)</title><subtitle type="html">&lt;strong&gt;I have now left EMC Consulting, if you wish to continue to receive new content then please subscribe to my new blog here: &lt;a href="http://www.readsource.co.uk" target=_blank&gt;http://www.readsource.co.uk&lt;a /&gt;&lt;/strong&gt;</subtitle><id>http://consultingblogs.emc.com/jamesdawson/atom.aspx</id><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/default.aspx" /><link rel="self" type="application/atom+xml" href="http://consultingblogs.emc.com/jamesdawson/atom.aspx" /><generator uri="http://communityserver.org" version="2.1.20423.1">Community Server</generator><updated>2007-05-24T00:46:00Z</updated><entry><title>T4: Pain Relief for .NET Configuration Management – Pt.1</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2011/03/04/t4-pain-relief-for-net-configuration-management-pt-1.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2011/03/04/t4-pain-relief-for-net-configuration-management-pt-1.aspx</id><published>2011-03-04T11:57:04Z</published><updated>2011-03-04T11:57:04Z</updated><content type="html">&lt;p&gt;Anyone who has done anything moderately complex with .NET will have undoubtedly felt the pain associated with having to deal with your application requiring different configuration settings when deployed into to different environments – and if you’re working with WCF then even more so! (Clearly this is a general pain felt across all flavours of development and whilst for purposes of this post I’m focussing on the .NET world, the core approach could be applied more broadly)&lt;/p&gt;  &lt;p&gt;Here at EMC Consulting this challenge has typically fallen to us Platform Architects to overcome, and over years we’ve evolved some in-house tooling that could integrate with our build and deployment processes whilst at the same time trying to minimise any additional overhead on the day-to-day development process.&amp;#160; The various evolutions all followed this basic premise:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Configuration settings that need to be environment-specific are replaced with tokens &lt;/li&gt;    &lt;li&gt;Maintain a set of mappings that assign the required values for each token, for a given environment &lt;/li&gt;    &lt;li&gt;During deployment, use a simple search &amp;amp; replacement operation to patch any tokenised configuration files with the required values &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The need for developers to have valid configuration files to support local their local build &amp;amp; debugging activities, meant that earlier iterations involved maintaining a template copy of each configuration file that contained environment sensitive settings.&amp;#160; Whilst this gave us a good story for not impacting the day-to-day developer activities, it did bring the additional overhead of having to keep the two files in-sync.&amp;#160; Inevitably, this would not always happen (particularly when the configuration change was not of an environment-specific nature) and thus the template version would become out of date and ultimately result in a deployment failure later on.&lt;/p&gt;  &lt;p&gt;It was this aspect that led me to think about alternative approaches that could reduce this overhead. Several years ago I remember seeing a cool approach for doing this that formed part of the Enterprise Library (EntLib) – whilst still relying on a separate configuration file it used a mechanism that permitted target configuration files to be transformed based on criteria in this separate configuration file (which only had to contain the elements that needed to change, rather than a complete copy of the target configuration file).&lt;/p&gt;  &lt;p&gt;Specifically, this approach expected you to define a transform for each environment where you would apply the required settings, but I figured you could equally create a single transform and use the tokens mentioned above instead and then run the search &amp;amp; replace operation against the transformed configuration file.&amp;#160; The main downside of this tool, in my view, was that it seemed to only work for custom configuration settings implemented via EntLib so could not be used to manage standard web.config settings, for example.&lt;/p&gt;  &lt;p&gt;I would hazard a guess that the above EntLib functionality was the basis/inspiration for the similar functionality we now see in the MSDeploy ‘configuration transform’ feature.&amp;#160; However, in terms of the out-of-the-box experience this feature is limited to web.config files, although there are various posts out there that show how to use it more broadly (&lt;a href="http://www.olegsych.com/2010/12/config-file-transformation/"&gt;http://www.olegsych.com/2010/12/config-file-transformation/&lt;/a&gt;).&amp;#160; Again, this approach could be combined with the use of tokens to avoid maintaining multiple transform files.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;With that background out of the way let’s get to the title point of this post – using T4 templates to address the issues outlined above.&lt;/p&gt;  &lt;p&gt;If you’d like some more information of T4, then here are a few links to get you started:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bb126445.aspx"&gt;http://msdn.microsoft.com/en-us/library/bb126445.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx"&gt;http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.olegsych.com/2007/12/text-template-transformation-toolkit/"&gt;http://www.olegsych.com/2007/12/text-template-transformation-toolkit/&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The essence of this approach is just an extension of the one above, and it looks like this:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Convert all configuration files that need to be environment-specific to be T4 templates &lt;/li&gt;    &lt;li&gt;Implement T4 logic that can inject into these configuration files, either:      &lt;ol&gt;       &lt;li&gt;actual values (to support local build &amp;amp; debugging activities) &lt;/li&gt;        &lt;li&gt;tokens (for deployment packages) &lt;/li&gt;     &lt;/ol&gt;   &lt;/li&gt;    &lt;li&gt;Utilise the T4 support built into Visual Studio to regenerate the config file using the #1 scenario above, whenever the file is modified&lt;/li&gt;    &lt;li&gt;Have the build process execute the T4 logic using the #2 scenario to create the tokenised configuration files&lt;/li&gt;    &lt;li&gt;Maintain a set of mappings that assign the required values for each token, for a given environment &lt;/li&gt;    &lt;li&gt;During deployment, use a simple search &amp;amp; replacement operation to patch any tokenised configuration files with the required values &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;This allows a single copy of that configuration file to be maintained (albeit in a modified form) and also has the added benefit of placing the environment-specific nature of the configuration file in clear view of anyone working on that file, hopefully making it more likely that they will think about the broader configuration concerns rather than just whatever it takes to get it working for them.&lt;/p&gt;  &lt;p&gt;In closing, at the risk of being hit with the ‘Not Invented Here’ stick, whilst the latest tools from Microsoft (config file transformations) are a welcome addition to the stock toolbox, they are limited to being used with XML files (and MSBuild seemingly) – which whilst representing the majority of scenarios does leave some edge cases unsupported.&amp;#160; As with most things in our industry there are many ways to solve this problem, and each has their own pros and cons and I present this as just another option.&lt;/p&gt;  &lt;p&gt;In my next post I’ll run through a sample implementation of the above.&lt;/p&gt;  &lt;p&gt;In the meantime, if you have any comments on this approach or can suggest other alternatives that have worked for you then please drop me a comment.&lt;/p&gt;  &lt;p&gt;Cheers, James.   &lt;br /&gt;(@James_Dawson)&lt;/p&gt;    &lt;p&gt;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=18260" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Visual Studio" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Visual+Studio/default.aspx" /><category term="ALM" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/ALM/default.aspx" /><category term="T4" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/T4/default.aspx" /></entry><entry><title>DevOps to Solve all the Software Delivery World’s Ills?</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2010/11/25/devops-to-solve-all-the-software-delivery-world-s-ills.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2010/11/25/devops-to-solve-all-the-software-delivery-world-s-ills.aspx</id><published>2010-11-25T23:58:00Z</published><updated>2010-11-25T23:58:00Z</updated><content type="html">&lt;P&gt;As part of my self-imposed DevOps induction I’ve been casually following the #devops feed on Twitter, and a tweet from @emmanuel_belo got me thinking – seemingly enough to spur me into firing-up Live Writer!&lt;/P&gt;
&lt;P&gt;&lt;A href="http://consultingblogs.emc.com/blogs/jamesdawson/image_6030934C.png"&gt;&lt;IMG style="BACKGROUND-IMAGE:none;BORDER-RIGHT-WIDTH:0px;MARGIN:0px;PADDING-LEFT:0px;PADDING-RIGHT:0px;DISPLAY:inline;BORDER-TOP-WIDTH:0px;BORDER-BOTTOM-WIDTH:0px;BORDER-LEFT-WIDTH:0px;PADDING-TOP:0px;" title=image border=0 alt=image src="http://consultingblogs.emc.com/blogs/jamesdawson/image_thumb_549AD60D.png" width=244 height=75&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Whilst the underlying point is rather self-evidently correct, I view it as a bit of a &lt;A href="http://en.wikipedia.org/wiki/Straw_man" target=_blank&gt;straw-man&lt;/A&gt; argument.&amp;nbsp; There are a multitude of difficulties associated with delivering quality software of which giving the user or customer actually what they want is just facet (albeit an important one).&amp;nbsp; As such there are plenty of strategies out there that aim to address this, but few of those really tackle the issue of the Development/Operations divide in any detailed way – for those that do, that part of the message tends to be lost amongst the rest of the goodness that they proffer us.&lt;/P&gt;
&lt;P&gt;It’s all to easy to say that DevOps doesn’t solve the whole problem, represents nothing new, or is nothing more than common sense and therefore deem it to be of limited value.&lt;/P&gt;
&lt;P&gt;Working in the consulting business as I do, does mean that I tend to miss out on the long-tail part of the application lifecycle – keeping it running in production, on-going releases etc.&amp;nbsp; However, the flip-side of that coin is that I get to see a lot of variety in terms of the technology, business models, delivery practises, team dynamics, to name but a few.&lt;/P&gt;
&lt;P&gt;The reality is that even in organisations that have done a good job at adopting these ‘other’ strategies for improving their software delivery capability, you still see this divide between their Development and Operations teams – no matter how agile or how refined their engineering practises are such a divide can still be hugely divisive.&lt;/P&gt;
&lt;P&gt;It is on this premise that I see the value in the notion of DevOps; it allow us to bring focus to a particular set of problems and in doing so (whilst not primarily concerned with the end-user or customer) should help ensure that customer requirements, particularly non-functional ones, are far more likely to be met – which seems like a ‘good thing’™ to me.&lt;/P&gt;
&lt;P&gt;To view DevOps as aiming to solve all our software delivery ills is to fall into the silver bullet trap, and frankly, miss the point.&lt;/P&gt;
&lt;P&gt;Cheers, James. &lt;BR&gt;(@James_Dawson)&lt;/P&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=17951" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="ALM" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/ALM/default.aspx" /><category term="DevOps" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/DevOps/default.aspx" /></entry><entry><title>On Discovering DevOps</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2010/11/23/on-discovering-devops.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2010/11/23/on-discovering-devops.aspx</id><published>2010-11-23T00:14:00Z</published><updated>2010-11-23T00:14:00Z</updated><content type="html">&lt;p&gt;A few weeks ago &lt;a target="_blank" href="http://consultingblogs.emc.com/jamessaull/"&gt;James&lt;/a&gt; sent me an e-mail saying that he’d been coming across this thing called ‘DevOps’ a lot lately and it seemed like it might be the closest thing yet to our Platform Architect role, outside of EMC Consulting.&lt;/p&gt;  &lt;p&gt;The Platform Architect team is a small, and mostly merry, band of technical consultants who typically started out their careers on the Infrastructure side of IT and have evolved to straddle the fence that divides the Infrastructure and Development worlds - if you read &lt;a target="_blank" href="http://consultingblogs.emc.com/gracemollison/"&gt;Grace’s&lt;/a&gt; blogs, then you’ll already have a fair idea of the types of things we get up to.&lt;/p&gt;  &lt;p&gt;So getting back to my introduction to the DevOps world, I was intrigued by it not least because I often struggle to define what we as PA’s do when talking to Clients without getting bogged-down in details; such is the breadth of what we have to cover.&amp;nbsp; Hence why coming across a term with a defined understanding in the outside world was of such interest to me, both in terms of talking to Clients as well as how we find and recruit new PA’s.&lt;/p&gt;  &lt;p&gt;Hunting around for some further reading, one of the first articles I came across, was a &lt;a target="_blank" href="http://www.jedi.be/blog/2010/02/12/what-is-this-devops-thing-anyway/"&gt;guest post&lt;/a&gt; by &lt;a target="_blank" href="http://agilesysadmin.net/"&gt;Stephen Nelson-Smith&lt;/a&gt; on the rather coolly-named &lt;a target="_blank" href="http://www.jedi.be/blog"&gt;jedi.be blog&lt;/a&gt; (&lt;b&gt;&lt;u&gt;J&lt;/u&gt;&lt;/b&gt;ust &lt;b&gt;&lt;u&gt;E&lt;/u&gt;&lt;/b&gt;nough &lt;b&gt;&lt;u&gt;D&lt;/u&gt;&lt;/b&gt;eveloped &lt;b&gt;&lt;u&gt;I&lt;/u&gt;&lt;/b&gt;nfrastructure – nice!) which resonated with me hugely.&amp;nbsp; As consultants, clearly we’re not sysadmins in the purest sense, but we are invariably the sysadmins for those projects that we’re involved with and as such the same pain points and desire to make things better still ring true.&amp;nbsp; However, one of the benefits of operating within the team at EMC Consulting is that the typical barriers between disciplines that Stephen mentions are far less prevalent, as is the siloisation, mainly due to working in small to medium-sized project teams.&amp;nbsp; That said, we will often collaborate with the Client’s various teams and it is here that we regularly see exactly the tensions between them that Stephen highlights, and in that respect our role is very much a bridging one too.&lt;/p&gt;  &lt;p&gt;One thing that seems notably absent from what I’ve read about DevOps (to-date) is any mention of &lt;a target="_blank" href="http://en.wikipedia.org/wiki/Application_lifecycle_management"&gt;Application Lifecycle Management&lt;/a&gt; (ALM) – this forms a fairly large part of the PA role here and I’m keen to learn whether ALM is indeed considered outside of DevOps, or whether I just haven’t been looking in the right places.&amp;nbsp; On the surface, much of what is talked about seems relevant to different parts of ALM but no-one seems to be making any explicit references to it.&amp;nbsp; I’d be really interested to hear from anyone who can shed some light on this, one way or the other.&lt;/p&gt;  &lt;p&gt;Configuration Management seems, understandably, to be a key topic in the DevOps world so in my next post I want to discuss an approach for tackling application configuration management that I’ve been working on lately.&amp;nbsp; I use a lowercase C &amp;amp; M on purpose, as it is very much a lightweight approach that aims to remove as much friction as possible from the task of making application configuration files environment-agnostic (e.g. not hard-coding server names, credentials, paths etc.) whilst at the same time ensuring that the need for this activity is still very much front-and-centre in the development team’s mind.&lt;/p&gt;  &lt;p&gt;Cheers,&lt;/p&gt;&lt;p&gt;James.&lt;/p&gt;&lt;p&gt;(@James_Dawson)&amp;nbsp;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=17941" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="DevOps ALM" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/DevOps+ALM/default.aspx" /></entry><entry><title>Installing TFS 2008 onto SQL Server 2008 SP1 (you can't!)</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2010/02/16/installing-tfs-2008-onto-sql-server-2008-sp1-you-can-t.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2010/02/16/installing-tfs-2008-onto-sql-server-2008-sp1-you-can-t.aspx</id><published>2010-02-16T01:25:11Z</published><updated>2010-02-16T01:25:11Z</updated><content type="html">&lt;p&gt;This post definitely falls into the 'note-to-self' category - myself and a blog-less colleague wasted a good few hours this morning trying to get Team Foundation Server (TFS) installed onto a new virtual machine.&lt;/p&gt;  &lt;p&gt;If you're in the habit of using slipstreaming to integrate service packs into products' base installers (to save time), which you can do with both TFS 2008 and SQL Server 2008, then be aware that TFS 2008 SP1 will not let you install to a server running SQL Server 2008 SP1 - it needs to be the RTM version.&amp;#160; Attempting to do so (as we did) will result in the TFS pre-install checks failing saying that a suitable version of SQL Server is not available.&lt;/p&gt;  &lt;p&gt;Initially I was convinced that I had previously done an installation with this combination, however, after a couple hours that self-belief was in tatters!&amp;#160; Fortunately, we were able to cleanly uninstall the SQL Server service pack via 'Add/Remove Programs', somewhat surprisingly, with no undue side effects on other databases that had already been deployed. (It's always nice when something works the way it's supposed to!)&lt;/p&gt;  &lt;p&gt;If you want more information on how to create slipstreamed versions of Team Foundation Server 2008 or SQL Server 2008, then you should take look at the following links:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;TFS 2008 SP1: &lt;a href="http://www.woodwardweb.com/" target="_blank"&gt;Martin Woodward's&lt;/a&gt; excellent post &lt;a href="http://www.woodwardweb.com/vsts/creating_a_tfs.html" target="_blank"&gt;here&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;SQL Server 2008 SP1: SQL Server has more formalised support for slipstreaming, which the &lt;a href="http://blogs.msdn.com/petersad/default.aspx" target="_blank"&gt;SQL Server Setup blog&lt;/a&gt; covers &lt;a href="http://blogs.msdn.com/petersad/archive/2009/02/25/sql-server-2008-creating-a-merged-slisptream-drop.aspx" target="_blank"&gt;here&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; I knew putting &amp;quot;can't&amp;quot; into the title would ensure I got proved wrong!&amp;#160; Thanks to &lt;a href="http://stuartpreston.net/blog/" target="_blank"&gt;@StuartPreston&lt;/a&gt; for pointing me in the direction of a hotfix that resolves this issue: &lt;a href="http://support.microsoft.com/kb/969985"&gt;http://support.microsoft.com/kb/969985&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;a href="http://support.microsoft.com/kb/969985"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=16875" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author></entry><entry><title>TFS vs. SVN vs. Git …</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2009/07/28/tfs-vs-svn-vs-git.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2009/07/28/tfs-vs-svn-vs-git.aspx</id><published>2009-07-28T15:15:00Z</published><updated>2009-07-28T15:15:00Z</updated><content type="html">&lt;p&gt;So, there’s been a bit of storm blowing through the part of the InterWeb that I inhabit recently – see &lt;a href="http://blog.benday.com/archive/2009/07/27/23233.aspx"&gt;http://blog.benday.com/archive/2009/07/27/23233.aspx&lt;/a&gt; for the low-down.&lt;/p&gt;  &lt;p&gt;I’ve seen these types of discussions countless times, both online and in the real world – the thing that wears me down the most is the seemingly constant assertion that ‘SVN/Git/Mercurial = TFS’, as if source control is the only consideration.&lt;/p&gt;  &lt;p&gt;Let me lay down a couple points of order before I get flamed to oblivion:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;I’ve generalised this assertion, somewhat &lt;/li&gt;    &lt;li&gt;I’ve spent time using both SVN and Git and like them both &lt;/li&gt;    &lt;li&gt;I have no desire to sound like a Microsoft shill! &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Fundamentally, SVN and TFS are implementations of a centralised version control system (VCS) that are designed using polar-opposite philosophies – TFS is server-centric whilst SVN is client-centric.&amp;nbsp; The reality is that both of these approaches have advantages and disadvantages in terms of usability and performance.&lt;/p&gt;  &lt;p&gt;Regarding the centralised versus distributed debate, I actually like a lot of things about Git et. al. and I would guess that as the various tooling/integration stories develop we will see more corporate and enterprise adoption.&lt;/p&gt;  &lt;p&gt;Getting to my point though, most of the customers I talk to rarely arrive at the TFS ‘answer’ on the basis of a VCS selection process (those that have, usually get a suggestion from me to look at other open source alternatives), they get there because they are looking for something to satisfy their Application Lifecycle Management (ALM) needs – I consider TFS to be pretty cost-effective in the ALM space.&amp;nbsp; Granted, there is a sizable chunk of TFS adopters who migrate from Visual SourceSafe (and are pre-disposed to use Microsoft tools) but as a like-for-like swap Microsoft have, in general terms, made that migration relatively painless.&lt;/p&gt;  &lt;p&gt;However, increasingly we’re seeing customers who have arrived at the TFS ‘answer’ because they use Scrum to manage their development projects and have chosen &lt;a href="http://www.scrumforteamsystem.com"&gt;Scrum for Team System&lt;/a&gt; (a TFS process template we make available for free) as their preferred project management tool - and from their perspective TFS comes with the added bonus of not having to worry about selecting and integrating a separate VCS and automated build system.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=15924" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Team Foundation Server" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+Foundation+Server/default.aspx" /><category term="Team System" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+System/default.aspx" /><category term="TFS" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/TFS/default.aspx" /><category term="Scrum" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Scrum/default.aspx" /><category term="Scrum for Team System" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Scrum+for+Team+System/default.aspx" /><category term="VSTS" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/VSTS/default.aspx" /></entry><entry><title>TFS, Build Servers and Un-Trusted Domains</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2009/06/12/tfs-build-servers-and-un-trusted-domains.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2009/06/12/tfs-build-servers-and-un-trusted-domains.aspx</id><published>2009-06-12T01:13:00Z</published><updated>2009-06-12T01:13:00Z</updated><content type="html">&lt;p&gt;I’ve been meaning to write this up for a while now, and a recent Twitter exchange with @thiago_bagua prompted me to finally get around to it.&amp;nbsp; This post will describe a way of getting a TFS 2008 build server up and running in an Active Directory domain that has no trust relationship with its associated TFS server.&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;CAVEAT&lt;/b&gt;: Whilst the approach I going to describe below worked for me, your mileage may vary and I doubt that it is an officially supported configuration.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;&lt;i&gt;Assumptions:&lt;/i&gt;&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;You have a working instance of TFS&lt;/li&gt;    &lt;li&gt;You have already installed the TFS Build Agent (aka Team Build) on your build server&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;The diagram below illustrates the basic scenario, with the TFS Application-Tier (AT) and TFS Build Agent residing in separate domains with no trust relationships.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_1BB41DC6.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="567" height="266" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_018FEC3D.png"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;With the above configuration there are basically two problems we need to overcome:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Build Agent that runs as a Windows service called ‘Visual Studio Team Foundation Build’, will need to authenticate with the TFS AT in order to consume the various web services (e.g. source control, work item tracking, publishing build results etc.) &lt;/li&gt;    &lt;li&gt;The TFS AT will need to authenticate with the Build Agent service in order to be allowed to start a build &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Build Agent to TFS Authentication&lt;/h3&gt;  &lt;p&gt;Solving the first problem involves storing a saved password in the profile of the Build Agent’s service account, in this scenario ‘DOMAINB\TFSBuild’, and ensuring that the server will use that credential automatically.&lt;/p&gt;  &lt;table border="0" cellspacing="0" cellpadding="2" width="798"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td&gt;1) &lt;/td&gt;        &lt;td&gt;Log onto the Build Agent server as the ‘DOMAINB\TFSBuild’ user (or equivalent)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;2) &lt;/td&gt;        &lt;td&gt;Open the ‘User Accounts’ Control Panel applet (also called ‘Stored User Names and Passwords’ on Windows Server 2003)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;3)&lt;/td&gt;        &lt;td&gt;&lt;p&gt;Select ‘Manage your network passwords’&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_7FDF2068.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="532" height="279" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_186EBDB9.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_7FDF2068.png"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;4)&lt;/td&gt;        &lt;td&gt;Add an entry for the server running the TFS Application Tier (you may want to add two, one for the server’s NetBIOS name and another for the server’s FQDN).          &lt;br&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_6BE58DD2.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="320" height="315" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_23B7D1F6.png"&gt;&lt;/a&gt;           &lt;br&gt;          &lt;br&gt;The username you enter here needs to be an account in the ‘DOMAINA’ domain that is a member of the ‘Build Services’ application group in the Team Project(s) the Build Agent will be servicing.           &lt;br&gt;&amp;nbsp;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_5B1DE324.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="318" height="372" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_79F45702.png"&gt;&lt;/a&gt;           &lt;br&gt;          &lt;br&gt;Here you can see both the NetBIOS and FQDN entries for the TFS server have been added.           &lt;br&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_2AA75EAE.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="323" height="318" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_497DD28C.png"&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;5)&lt;/td&gt;        &lt;td&gt;Review the Internet Explorer security settings of the ‘Local Intranet Zone’ and ensure that the ‘Automatic logon only in Intranet zone’ is selected.          &lt;br&gt;&amp;nbsp;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_086F5328.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="322" height="397" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_14249A5A.png"&gt;&lt;/a&gt;           &lt;br&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_595CF183.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="325" height="366" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_51654F21.png"&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;6)&lt;/td&gt;        &lt;td&gt;By default the FQDN of the TFS Application Tier is unlikely to be treated as being in the Intranet Zone, so we need to add it explicitly.          &lt;br&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_424E7047.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="326" height="402" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_4E03B779.png"&gt;&lt;/a&gt;           &lt;br&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/image_133C0EA3.png"&gt;&lt;img style="border-right-width:0px;display:inline;border-top-width:0px;border-bottom-width:0px;border-left-width:0px;" title="image" border="0" alt="image" width="328" height="286" src="http://blogs.conchango.com/blogs/jamesdawson/image_thumb_7DDE593A.png"&gt;&lt;/a&gt; &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;7)&lt;/td&gt;        &lt;td&gt;You should now be able to test these changes by opening Team Explorer and verifying that you are able to transparently connect to the TFS server (i.e. you aren’t prompted to enter credentials).&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;TFS-to-Build Agent Authentication&lt;/h3&gt;  &lt;p&gt;Having completed the above, we now just need to solve the second problem.&amp;nbsp; My approach was to create a local account on the Build Agent with the same username and password as the account used as the identity of the ‘Microsoft Team Foundation Server Application Pool’ on the TFS Application Tier.&amp;nbsp; This has the effect of allowing the TFS Application Tier to authenticate to the build server using it credentials.&lt;/p&gt;  &lt;p&gt;As an alternative to this, you could setup a saved password, this time on the TFS server, in the profile of the ‘DOMAINA\TFSService’ account for the build agent server that use a domain account in ‘DOMAINB’ or local account on the build server.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;At this point you should be able to register the new build agent in your Team Project and queue a build to it.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Troubleshooting&lt;/h3&gt;  &lt;p&gt;If you have hit problems whilst trying the queue the build, then this indicates that the TFS Application Tier had a problem connecting to the build agent.&amp;nbsp; This is typically caused by TFS not being able to authenticate to the build agent or some kind of firewalling preventing the network connection, usually via TCP port 9191.&lt;/p&gt;  &lt;p&gt;If the build starts but quickly fails, then this generally points to either or both of the following:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;The Build Agent service account cannot authenticate to the TFS Application Tier (i.e. a problem with its saved username/password). &lt;/li&gt;    &lt;li&gt;The saved username/password has not been added to the ‘Build Services’ application group in the relevant Team Project. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Anyway, if you find yourself in this sort of edge case scenario then hopefully the steps detailed here will be helpful. &amp;nbsp;I'm now wondering whether a similar approach could be used to workaround the issue of not being able to add users, from a Trusting domain, to TFS application groups when there isn't a 2-way trust in place...?&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=15510" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Team Foundation Server" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+Foundation+Server/default.aspx" /><category term="Security" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Security/default.aspx" /><category term="TFS" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/TFS/default.aspx" /><category term="Team Build" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+Build/default.aspx" /><category term="TFS2008" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/TFS2008/default.aspx" /><category term="Trust" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Trust/default.aspx" /></entry><entry><title>Using Linked Files with Web Application Projects</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2008/06/03/using-linked-files-with-web-application-projects.aspx" /><link rel="enclosure" type="application/zip" length="12047" href="http://consultingblogs.emc.com/jamesdawson/attachment/11305.ashx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2008/06/03/using-linked-files-with-web-application-projects.aspx</id><published>2008-06-03T00:51:00Z</published><updated>2008-06-03T00:51:00Z</updated><content type="html">&lt;p&gt;A customer recently contacted me saying that they had upgraded to Visual Studio 2008 and had also taken the opportunity to switch from a Web Site Project to a Web Application Project.&amp;nbsp; A while back I'd helped them to centralise some of their configuration so that they only had a single copy of all the configuration sections that were referenced by multiple projects (e.g. the web site, various unit test projects etc.).&lt;/p&gt;  &lt;p&gt;This involved creating separate configuration files for each section and referencing them from the main web/app config using the '&lt;span style="color:red;"&gt;configSource&lt;/span&gt;' attribute, for example:&lt;/p&gt;  &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Reference the shared config file &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;configSource&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;dbConfig.config&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;The above referenced configuration file would something like this:&lt;/p&gt;  &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;add &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;DB1&lt;/span&gt;"&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;connectionString&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Data Source=.;Initial Catalog=DB1;Integrated Security=SSPI&lt;/span&gt;"&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;providerName&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;System.Data.SqlClient&lt;/span&gt;" &lt;span style="color:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;connectionStrings&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;Due to the '&lt;span style="color:red;"&gt;configSource&lt;/span&gt;' attribute not supporting relative paths, it was necessary to setup pre-Build events to copy the referenced files into the project folder - especially for the Web Site project where a valid web.config is required by the ASPNET compiler.&lt;/p&gt;  &lt;p&gt;After the switch to the Web Application project model the client was wondering whether they needed to change how they were handling these shared configuration files.&amp;nbsp; My initial response was to suggest that they discontinue the pre-build scripts and instead use the 'linked files' feature that was available with web application projects (much like they have been for other types of projects a long time).&lt;/p&gt;  &lt;p&gt;For those of you unfamiliar with this useful feature, here's how you add a linked file via the 'Add Existing Item' option:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_4.png"&gt;&lt;img src="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_thumb_1.png" style="border-width:0px;" alt="image" border="0" height="401" width="490"&gt;&lt;/a&gt; &lt;a href="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_10.png"&gt;&lt;img src="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_thumb_4.png" style="border-width:0px;" alt="image" border="0" height="190" width="244"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Such files appear in Solution Explorer as normal project items, albeit with a shortcut icon.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_8.png"&gt;&lt;img src="http://blogs.conchango.com/blogs/jamesdawson/WindowsLiveWriter/UsingLinkedFileswithWebApplicationProjec_9E8B/image_thumb_3.png" style="border-width:0px;" alt="image" border="0" height="228" width="296"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;However, after trying it, they reported that those files were missing from the web site which was causing all manner of problems.&lt;/p&gt;  &lt;p&gt;It turns out that when you build the project linked files are not copied into the project folder, which is obviously a problem as it means that the file is not available to the web site at runtime.&amp;nbsp; Your first thought might be to enable the 'Copy Local' option for the linked files, however, all this does is to copy the linked files to the 'bin' folder... not exactly the result we're after.&lt;/p&gt;  &lt;p&gt;Before carrying on, it's worth looking at how the linked items are stored in the actual web application project file, as it will later help us understand why this issue occurs.&lt;/p&gt;  &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Content&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Include&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;..\..\dbConfig.config&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Link&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;dbConfig.config&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Link&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;Content&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;ItemGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;From this you can see the main path for the item (the 'Include' attribute) is a relative path to the shared configuration file, whilst the 'Link' attribute tells Visual Studio where the item exists within the project - in this case, the file was added to the root of the project.&lt;/p&gt;  &lt;p&gt;To investigate further I took a look at the '&lt;font face="consolas"&gt;Microsoft.WebApplication.targets&lt;/font&gt;' file that contains the Web Application project build process and typically lives in the '&lt;font face="consolas"&gt;C:\Program Files\MSBuild\Microsoft\VisualStudio\v9.0\WebApplications&lt;/font&gt;' folder.&amp;nbsp; There I found a target called '&lt;font face="consolas"&gt;_CopyWebApplication&lt;/font&gt;' which only gets executed when the output directory has been overridden (e.g. what TeamBuild does to redirect all build outputs into a single directory):&lt;/p&gt;  &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;_CopyWebApplication&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;'$(OutDir)' != '$(OutputPath)'&lt;/span&gt;"&lt;span style="color:blue;"&gt; &amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;At the end of this Target there is the following call to the MSBuild Copy task:&lt;/p&gt;  &lt;div style="background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;"&gt;   &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Copy content files recursively to _PublishedWebsites\app\ folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(Content)&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\%(Content.RelativeDir)&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;So when the above Copy task executes it's going to use the relative path to the linked item as part of the destination path, rather than the path within the project (i.e. the 'Link' attribute) - so this explains why the files aren't getting copied:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div&gt;When building in Visual Studio, nothing special happens to copy the content files (linked or otherwise)&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;When redirecting the output path, normal Content files are copied fine (their 'Include' attribute does not contain a relative path), but the linked content files will get copied to a folder with the same relative path to the actual output folder, as the linked item has to the project file (e.g. '&lt;font face="Consolas" size="2"&gt;MyOutDir\..\..\dbConfig.config&lt;/font&gt;' instead of '&lt;font face="Consolas" size="2"&gt;MyOutDir\dbConfig.config&lt;/font&gt;')&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Anyway, let's cut to the chase... here is my suggested workaround:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div&gt;Fix the 'Copy' task to not include linked files&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;Create another target to handle the copying of linked files using the correct destination path&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;To achieve the first, we'll need to override the built-in '_CopyWebApplication' target by pasting it into our web application's project file and tweaking the 'Copy' task mentioned above:&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; ============================================================&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; _CopyWebApplication&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; MODIFIED: Ignores linked files as part of normal deployment logic.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; This target will copy the build outputs along with the &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; content files into a _PublishedWebsites folder.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; This Task is only necessary when $(OutDir) has been redirected&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; to a folder other than ~\bin such as is the case with Team Build.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; ============================================================&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;_CopyWebApplication&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;'$(OutDir)' != '$(OutputPath)'&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Log tasks &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Message&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Text&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;Copying Web Application Project Files for $(MSBuildProjectName)&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Create the _PublishedWebsites\app\bin folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;MakeDir&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Directories&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Copy build outputs to _PublishedWebsites\app\bin folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(IntermediateAssembly)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(AddModules)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(IntermediateOutputPath)$(_SGenDllName)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\%(Content.SubFolder)%(Content.RecursiveDir)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;'$(_SGenDllCreated)'=='true'&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(IntermediateOutputPath)$(TargetName).pdb&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;'$(_DebugSymbolsProduced)'=='true'&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(DocFileItem)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;'$(_DocumentationFileProduced)'=='true'&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(IntermediateSatelliteAssembliesWithTargetPath)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(IntermediateSatelliteAssembliesWithTargetPath-&amp;gt;'$(WebProjectOutputDir)\bin\%(Culture)\$(TargetName).resources.dll')&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(ReferenceComWrappersToCopyLocal); @(ResolvedIsolatedComModules); @(_DeploymentLooseManifestFile); @(NativeReferenceFile)&lt;/span&gt;"&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:red;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; copy any referenced assemblies to _PublishedWebsites\app\bin folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;@(ReferenceCopyLocalPaths)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\bin&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SkipUnchangedFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;true&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; MODIFICATION HERE: Copy local content files (i.e. non-linked files) recursively to _PublishedWebsites\app\ folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt; '%(Content.Link)' == '' &lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;%(Content.Identity)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFolder&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\%(Content.RelativeDir)&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;For the second, we need to add a new target to our project file and override the default dependencies to have it executed:&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; ============================================================&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; CopyLinkedContentFiles&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; A new target to copy any linked content files into the &lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; web application output folder.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; NOTE: This is necessary even when '$(OutDir)' has not been redirected.&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; ============================================================&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:green;"&gt;&amp;nbsp; &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;CopyLinkedContentFiles&lt;/span&gt;"&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Remove any old copies of the files &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Delete&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt; '%(Content.Link)' != '' AND Exists('$(WebProjectOutputDir)\%(Content.Link)') &lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&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:red;"&gt;Files&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\%(Content.Link)&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Copy linked content files recursively to the project folder &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;Copy&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;Condition&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt; '%(Content.Link)' != '' &lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;SourceFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;%(Content.Identity)&lt;/span&gt;"&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;font color="#0000ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;span style="color:red;"&gt;DestinationFiles&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;"&lt;span style="color:blue;"&gt;$(WebProjectOutputDir)\%(Content.Link)&lt;/span&gt;"&lt;span style="color:blue;"&gt; /&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;Target&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; Override the default target dependencies to &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;!--&lt;/span&gt;&lt;span style="color:green;"&gt; &lt;/span&gt;&lt;span style="color:green;"&gt;include the new &lt;/span&gt;&lt;span style="color:green;"&gt;_CopyLinkedContentFiles target. &lt;/span&gt;&lt;span style="color:blue;"&gt;--&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span&gt;PrepareForRunDependsOn&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $(PrepareForRunDependsOn);&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _CopyWebApplication;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CopyLinkedContentFiles;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _BuiltWebOutputGroupOutput&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;PrepareForRunDependsOn&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin:0px;background:white none repeat scroll 0% 50%;font-size:10pt;-moz-background-clip:-moz-initial;-moz-background-origin:-moz-initial;-moz-background-inline-policy:-moz-initial;color:black;font-family:consolas;" align="left"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span&gt;PropertyGroup&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;With these changes, whenever you build the web project any linked content files will be copied into the web application's folder structure&amp;nbsp; - whether you override the default output directory or not.&lt;/p&gt;  &lt;p&gt;If anyone is interested I've attached a sample solution that demonstrates the above workaround (as well as an unmodified project file so you can see the issue).&lt;/p&gt;  &lt;p&gt;Part of me wonders whether this is a bug at all, or whether it is in fact just an unexpected feature that was never supposed to be supported... I've raised a bug on &lt;a href="https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=348886" target="_blank"&gt;Connect&lt;/a&gt;, so I guess I'll find out in due course.&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=11305" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Visual Studio" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Visual+Studio/default.aspx" /><category term="MSBuild" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/MSBuild/default.aspx" /></entry><entry><title>TeamBuild Plug-in for CruiseControl.NET now on CodePlex</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2007/11/24/TeamBuild-Plug_2D00_in-for-CruiseControl.NET-now-on-CodePlex.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2007/11/24/TeamBuild-Plug_2D00_in-for-CruiseControl.NET-now-on-CodePlex.aspx</id><published>2007-11-24T22:27:00Z</published><updated>2007-11-24T22:27:00Z</updated><content type="html">&lt;p&gt;Back in May this year I blogged about a CruiseControl.NET plug-in that I had written to allow CCNet to trigger a TFS Build - I had a few comments at the time, but recently I&amp;#39;ve had a flurry of comments &amp;amp; emails (well, a comparative flurry for my blog anyway!), many with the recurring theme of requesting the source.&amp;nbsp; Having been on a project full time for most of this year, I&amp;#39;ve found very little time to revisit this - other than a couple of minor private fixes for people who emailed me.&amp;nbsp; I&amp;#39;ve recently begun to roll-off this long term project so have finally found some time for this.&lt;/p&gt;&lt;p&gt;I&amp;#39;ve setup a new CodePlex project (called&amp;nbsp;&lt;a href="http://www.codeplex.com/CcNetTeamBuildTask" title="http://www.codeplex.com/CcNetTeamBuildTask" target="_blank"&gt;CcNetTeamBuildTask&lt;/a&gt;) to host the source code and have published a release of the plug-in.&amp;nbsp; The following is a list of the main changes&amp;nbsp; compared to the version I posted back in May.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Compiled against the latest version of CruiseControl.NET - &lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;v1.3.0.2918&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;Fixed a bug that manifested itself when dealing with Team Project names that contained spaces&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;Fixed a bug with publishing the MSTest code coverage results, that occurred when specifying your build server using an FQDN (if you specify your build server by IP address, then this functionality will probably still not work for you)&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;Removed the task&amp;#39;s queuing logic as CCNet now provides this out-of-the-box&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;New configuration property &amp;#39;pathToTfExe&amp;#39; to support scenarios where Visual Studio is not installed in the default location&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;New configuration property &amp;#39;useXmlLogger&amp;#39; to more easily switch between text or XML based MSBuild logging&lt;/span&gt;&lt;/li&gt;&lt;ul&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;Currently,
the XML log file can only be automatically published by the task if you
customise your TeamBuild to copy the &amp;#39;msbuild-results.xml&amp;#39; file to the
Drops Location&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;The text log file (BuildLog.txt) will always be automatically published to the CCNet Dashboard if this option is false&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;span id="ctl00_ctl00_Content_TabContentPanel_Content_ChangeSetList_ctl03_CommentLabel"&gt;A general tidy-up of the code&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;With the release of TFS 2008, I&amp;#39;m unsure whether this plug-in will be as valuable given the new features that Microsoft has added to TFS - but feel free to drop me a line if you have any ideas or would like to join the project.&lt;/p&gt;Cheers, James.&lt;br /&gt;&lt;br /&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=9183" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Team Foundation Server" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+Foundation+Server/default.aspx" /><category term="Continuous Integration" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Continuous+Integration/default.aspx" /></entry><entry><title>Configuring DCOM Security</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2007/09/06/Configuring-DCOM-Security.aspx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2007/09/06/Configuring-DCOM-Security.aspx</id><published>2007-09-06T21:52:00Z</published><updated>2007-09-06T21:52:00Z</updated><content type="html">&lt;p&gt;This post started out as a comment on one of &lt;a href="http://blogs.conchango.com/jamiethomson/archive/2007/09/04/SSIS_3A00_-Problems-executing-out_2D00_of_2D00_process.aspx"&gt;Jamie&amp;#39;s recent posts&lt;/a&gt;, however, I realised that the explanation would be easier to follow with screenshots... so here we go.&lt;br /&gt;&lt;br /&gt;To paraphrase, Jamie&amp;#39;s issue was that whilst trying to use an SSIS package he was getting a DCOM access denied error (full details here) - this had worked in previous environments, but not once it got to Production.&amp;nbsp; The eventual solution that got everything working was to make the account running the package a local administrator (as it was in other environments) and reboot the server.&lt;br /&gt;&lt;br /&gt;Whilst this obviously got things working, what I&amp;#39;d like to illustrate here is a more secure way of overcoming this type of issue - as a platform guy, developer code running with full admin rights makes me twitchy! &lt;img src="http://blogs.conchango.com/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;DCOM security is managed using the &amp;#39;Component Services&amp;#39; MMC snap-in, a shortcut to which is &amp;#39;Start -&amp;gt; Run -&amp;gt; DCOMCNFG&amp;#39;&lt;/p&gt;&lt;p&gt;&lt;img /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8355/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8355/original.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The next step is locate the component that needs to have its security tweaked.&amp;nbsp; Jamie&amp;#39;s post shows how to use the CLSID from the error message to locate the registration information for the component in the Registry.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8357/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8357/original.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The value of the &amp;#39;&amp;#39;AppID&amp;#39; key is the surefire way of locating the component in DCOMCNFG, however, this is only visible from the component&amp;#39;s property page - so ideally you want to find&lt;br /&gt;the component by name.&amp;nbsp; However, the names in DCOMCNFG do not necessarily exactly match those in the registry (typically it&amp;#39;s a substring).&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8358/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8358/original.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Armed with the AppID and some ideas about the component name, return to DCOMCNFG and start hunting:&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8359/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8359/original.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Once you&amp;#39;ve found a candiate, open its properties and verify the AppID&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8360/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8360/original.aspx" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;If you&amp;#39;ve found it, select the &amp;#39;Security&amp;#39; tab, select &amp;#39;Customize&amp;#39; and &amp;#39;Edit..&amp;#39; under &amp;#39;Launch and Activation Permissions&amp;#39;, and grant the required user the rights requested in the original error message.&lt;/p&gt;&lt;p&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/picture8361.aspx" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://blogs.conchango.com/photos/conchango_bloggers/images/8361/original.aspx" target="_blank"&gt;&lt;img border="0" src="http://blogs.conchango.com/photos/conchango_bloggers/images/8361/original.aspx" /&gt;&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now you should be good to go. (complete with that warm and fuzzy feeling that you get from knowing that you haven&amp;#39;t unduly compromised server security)&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=8354" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Security" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Security/default.aspx" /></entry><entry><title>TeamBuild Plug-in for CruiseControl.NET</title><link rel="alternate" type="text/html" href="http://consultingblogs.emc.com/jamesdawson/archive/2007/05/24/TeamBuild-Plug_2D00_in-for-CruiseControl.NET.aspx" /><link rel="enclosure" type="application/x-zip-compressed" length="7180" href="http://consultingblogs.emc.com/jamesdawson/attachment/7046.ashx" /><id>http://consultingblogs.emc.com/jamesdawson/archive/2007/05/24/TeamBuild-Plug_2D00_in-for-CruiseControl.NET.aspx</id><published>2007-05-23T23:46:00Z</published><updated>2007-05-23T23:46:00Z</updated><content type="html">&lt;p&gt;I&amp;#39;ve been meaning to write this post for a couple of months now as a follow-up to a session that&amp;nbsp;&lt;a href="http://blogs.conchango.com/colinbird"&gt;Colin&lt;/a&gt; and I gave at the &lt;a href="http://msdn2.microsoft.com/en-gb/architecture/aa973290.aspx"&gt;Microsoft Architect Insight Conference&lt;/a&gt; back in March, but just haven&amp;#39;t found&amp;nbsp;the time... at least, that&amp;#39;s my excuse - anyway cutting to the chase!&lt;/p&gt;&lt;p&gt;Since the release of Team Foundation Server (TFS)&amp;nbsp;there have been&amp;nbsp;several Continuous Integration add-ons produced by various folks:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/automation"&gt;Automaton&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://notgartner.wordpress.com/2006/09/18/getting-started-with-tfs-integrator/"&gt;TFSIntegrator&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/khushboo/archive/2006/01/04/509122.aspx"&gt;CI Sample&lt;/a&gt;&amp;nbsp;- &lt;a href="http://blogs.vertigosoftware.com/teamsystem/archive/2006/07/14/3075.aspx"&gt;(also&amp;nbsp;its &amp;#39;Vertigo remix&amp;#39;)&lt;/a&gt; &lt;/li&gt;&lt;li&gt;... and I dare say many more (not to mention the one that Microsoft are slated to ship with the Orcas release of VSTS)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;We&amp;#39;ve&amp;nbsp;used most&amp;nbsp;of the above, but despite however well they worked&amp;nbsp;have found myself wanting some feature or other that was available in CCNet (actually it more about being badgered by developers about the missing features!).&amp;nbsp; Whilst some of the above could have been extended to support these features, I couldn&amp;#39;t help but feel that this would have been reinventing the wheel - hence the idea to extend CCNet.&lt;/p&gt;&lt;p&gt;By the time I started this Vertigo had already released the &lt;a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=TFSCCNetPlugin"&gt;VSTS plug-in for CCNet&lt;/a&gt; (which is a CCNet source control plug-in), so it was just a matter of producing a&amp;nbsp;CCNet task plug-in that was able to trigger a Team Build.&amp;nbsp; The guts of calling the Team Build web service I based on&amp;nbsp;the original CI Sample, but I was also keen&amp;nbsp;to provide a mechanism for customising the behaviour of a Team Build in a more dynamic way than just creating another build type and changing the MSBuild properties.&lt;/p&gt;&lt;p&gt;Team Build provides a mechanism for passing custom MSBuild properties into it via a source controlled file called TFSBuild.rsp.&amp;nbsp; This file consists of 1 or more lines each containing a valid MSBuild commandline switch (e.g. &lt;em&gt;/p:PropName=value&lt;/em&gt;, would set the property &amp;#39;PropName&amp;#39; to be &amp;#39;value&amp;#39;).&amp;nbsp; With that in mind, I developed the plug-in to allow these switches to be specified in the CCNet server configuration file (on a per CCNet project basis) and have it update the&amp;nbsp;&amp;#39;.rsp&amp;#39; (in source control) before calling the build web service.&lt;/p&gt;&lt;p&gt;I&amp;#39;ll hold off diving into any more detail at this point, but if there is interest out there then I can do a follow-up.&lt;/p&gt;&lt;p&gt;Attached to this post should be the plug-in assembly which you need to copy into your CCNet &amp;#39;server&amp;#39; directory (along with the VSTS plug-in referred to above), and below is a configuration excerpt that shows how to configure the &amp;#39;teambuild&amp;#39; task in CCNet.&lt;/p&gt;&lt;div style="font-size:10pt;background:white;color:black;font-family:Consolas;"&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;project&lt;/span&gt;&lt;span style="color:blue;"&gt; &lt;/span&gt;&lt;span style="color:red;"&gt;name&lt;/span&gt;&lt;span style="color:blue;"&gt;=&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;TeamBuild_CI&lt;/span&gt;&amp;quot;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tasks&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teambuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tfsServerUri&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;http://MyTfsServer:8080&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tfsServerUri&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamBuildServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyBuildServer&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamBuildServer&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamProject&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyTeamProject&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamProject&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamBuildType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyTeamBuildType&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teamBuildType&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;workspace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyBuildServer_MyTeamProject_MyTeamBuildType&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;workspace&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dropsLocation&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;MyDropsArea\MyTeamProject&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;dropsLocation&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;msBuildParameters&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/v:d&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/logger:ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll;msbuild-output.xml&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/p:SkipInitializeWorkspace=true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/p:SkipGet=true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/p:SkipClean=true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;/p:SkipDropBuild=true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;MsBuildParameter&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;msBuildParameters&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;useMsTest&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;useMsTest&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;useMsTestCodeCoverage&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;useMsTestCodeCoverage&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;teambuild&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;tasks&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;publishers&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;merge&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;files&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;file&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;C:\MyTeamBuildWorkspacePath\MyTeamProject\MyTeamBuildType\BuildType\msbuild-output.xml&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;file&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;files&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;merge&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xmllogger&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515;"&gt;logDir&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;.\Web\Logs&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;logDir&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;xmllogger&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;publishers&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;nbsp; ...&lt;/span&gt;&lt;/p&gt;&lt;p style="margin:0px;"&gt;&lt;span style="color:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515;"&gt;project&lt;/span&gt;&lt;span style="color:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;Let me know if you find it useful, interesting or a waste of your time! (actually, maybe save your bandwidth in the case of the latter).&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://consultingblogs.emc.com/aggbug.aspx?PostID=7046" width="1" height="1"&gt;</content><author><name>james.dawson</name><uri>http://consultingblogs.emc.com/members/james.dawson.aspx</uri></author><category term="Team Foundation Server" scheme="http://consultingblogs.emc.com/jamesdawson/archive/tags/Team+Foundation+Server/default.aspx" /></entry></feed>
