Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TFS Build not transforming web.config as expected

The goal is to have TFS build and deploy 2+ different configurations, and have the web.config transform files include the intended content in their output. This in an ASP.NET MVC project.

alt text

Web.Debug.Config - see on PasteBin.
Web.Release.Config - see on PasteBin

The 2 transformed config files have their Build Action set to None. This was modified because all 3 web.*.config files were being included in the deployment.

TFS is configured correctly to build and deploy both configurations. It deploys to the 2 drop locations as expected. There are no MSBuild Arguments specified in the build definition.

alt text

Problem: The 2 built and deployed web sites have the same web.config file. Basically it's as if the transformed files did not exist.

Expected: the changes specified (xdt:Transform="Replace" and xdt:Transform="Remove") would be present in the web.config files.

How can you configure your project or TFS to ensure the web.config transformations are processed and their outputs deployed to the correct deployment locations? What else can I check/modify?

  • Have confirmed that the transformations are good -- Vishal's Joshit's tutorial with the MSBuild on the command line output the correct transformations!
  • No modifications have been made to the .csproj for any post-build or deployment.
  • Are any xdt attributes being misused or missing?
  • There are no MSBuild Arguments specified in the build definition.
  • Are the web.config Build Actions set correctly?
  • We're not using web deployment packages or anything. Simply expecting to xcopy these outputs over to their various webserver locations at a later date.

If I'm missing any important information, please leave a comment, and I'll include any more relevant information!

like image 827
p.campbell Avatar asked Jan 20 '11 18:01

p.campbell


2 Answers

Previously I had been doing something similar to the other answers. However, I just found what seems to be a better solution to this problem. Just add "/p:UseWPP_CopyWebApplication=true /p:PipelineDependsOnBuild=false" to your MSBuild arguments. I just tried this out on one of my TFS builds and it works just fine.

I found this great tip here: http://www.andygeldman.com/index.php/2011/10/web-and-app-config-transformations-with-tfs-build.

like image 112
Bart Sipes Avatar answered Nov 08 '22 20:11

Bart Sipes


Here's what I've been using. The current TransformXml task has a bug where it leaves files open. Read more here.

You can call this task and deploy for each configuration you're working with.

<Target Name="TransformWebConfig">

    <PropertyGroup>
        <_tempSourceFile>$([System.IO.Path]::GetTempFileName())</_tempSourceFile>
        <_tempTransformFile>$([System.IO.Path]::GetTempFileName())</_tempTransformFile>
    </PropertyGroup>

    <Copy SourceFiles="$(_websiteDirectory)\Web.config" DestinationFiles="$(_tempSourceFile)"/>
    <Copy SourceFiles="$(_websiteDirectory)\Web.$(_transformConfiguration).config" DestinationFiles="$(_tempTransformFile)"/>

    <MSBuild.Community.Tasks.Attrib Files="$(_websiteDirectory)\Web.config" ReadOnly="false" />

    <TransformXml Source="$(_tempSourceFile)"
                  Transform="$(_tempTransformFile)"
                  Destination="$(_websiteDirectory)\Web.config"
                  StackTrace="false" />
</Target>
like image 8
Danny Avatar answered Nov 08 '22 21:11

Danny