Search code examples
asp.netxmlvisual-studio-2010msbuildweb-config-transform

MSBuild Script and VS2010 publish apply Web.config Transform


So, I have VS 2010 installed and am in the process of modifying my MSBuild script for our TeamCity build integration. Everything is working great with one exception.

How can I tell MSBuild that I want to apply the Web.conifg transform files that I've created when I publish the build...

I have the following which produces the compiled web site but, it outputs a Web.config, Web.Debug.config and, Web.Release.config files (All 3) to the compiled output directory. In studio when I perform a publish to file system it will do the transform and only output the Web.config with the appropriate changes...

<Target Name="CompileWeb">
    <MSBuild Projects="myproj.csproj" Properties="Configuration=Release;" />
</Target>

<Target Name="PublishWeb" DependsOnTargets="CompileWeb">
    <MSBuild Projects="myproj.csproj"
    Targets="ResolveReferences;_CopyWebApplication"
    Properties="WebProjectOutputDir=$(OutputFolder)$(WebOutputFolder);
                OutDir=$(TempOutputFolder)$(WebOutputFolder)\;Configuration=Release;" />
</Target>

Any help would be great..!

I know this can be done by other means but I would like to do this using the new VS 2010 way if possible


Solution

  • I was looking for similar information and didn't quite find it, so I did some digging around in the .targets files that come with Visual Studio 2010 and MSBuild 4.0. I figured that was the best place to look for the MSBuild task that would perform the transformation.

    As far as I have been able to tell, the following MSBuild task is used:

    <Project ToolsVersion="4.0"
             DefaultTargets="Deploy"
             xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    
        <UsingTask TaskName="TransformXml"
                   AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
    
        <PropertyGroup>
            <ProjectPath>C:\Path to Project\Here</ProjectPath>
            <DeployPath>C:\Path to Deploy\There</DeployPath>
            <TransformInputFile>$(ProjectPath)\Web.config</TransformInputFile>
            <TransformFile>$(ProjectPath)\Web.$(Configuration).config</TransformFile>
            <TransformOutputFile>$(DeployPath)\Web.config</TransformOutputFile>
            <StackTraceEnabled>False</StackTraceEnabled>
        </PropertyGroup>
    
    
        <Target Name="Transform">
            <TransformXml Source="$(TransformInputFile)"
                          Transform="$(TransformFile)"
                          Destination="$(TransformOutputFile)"
                          Condition="some condition here"
                          StackTrace="$(StackTraceEnabled)" />
        </Target>
    </Project>
    

    I have tested the above and can confirm that it works. You might need to tweak the structure a bit to fit with your build script better.