MSBuild Script and VS2010 publish apply Web.config Transform

前端 未结 6 1269
囚心锁ツ
囚心锁ツ 2020-11-28 01:13

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.

相关标签:
6条回答
  • 2020-11-28 01:41

    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.

    0 讨论(0)
  • 2020-11-28 01:45

    Another answer to this topic after I've been searching for days before I tackled this issue:

    Your publish profile and configuration names should match.

    In my case mine didn't. Manually publishing through the publishing profile gave me the result I wanted, because my configuration was set in the publish profile. MSBuild however tries to be intelligent and magically connects the publish profile and configuration based on name. (Adding the /p:Configuration in the command resulted in other strange errors about the outputpath of a referenced project).

    Just to be exactly clear in what I mean:

    MSBuild statement from command line

    msbuild myproject.csproj -t:Clean -t:Rebuild /p:DeployOnBuild=true /p:PublishProfile="Development"

    WORKS

    • Publish Profile name: Development
    • Solution Configuration name: Development

    DOES NOT WORK

    • Publish Profile name: Development
    • Solution Configuration name: Dev

    Hope this helps!

    0 讨论(0)
  • 2020-11-28 01:46

    I'm no expert with MSBuild, but I was able to use the information from this link to accomplish the same task:

    http://www.hanselman.com/blog/ManagingMultipleConfigurationFileEnvironmentsWithPreBuildEvents.aspx

    There is a section related to MSBuild near the bottom of the article. Hope this helps.

    0 讨论(0)
  • 2020-11-28 01:57

    Alternatively, you try using the XDT Transformation Tool:

    http://ctt.codeplex.com

    I'm using this instead of messing with obscure msbuild targets. Works with app.config not just web.config.

    0 讨论(0)
  • 2020-11-28 01:59

    It worked for me with the following change

    <MSBuild Projects="$(ProjectFile)"
             Targets="ResolveReferences;_WPPCopyWebApplication"
         Properties="WebProjectOutputDir=TempOutputFolder;OutDir=$(WebProjectOutputDir);Configuration=$(Configuration);" />
    

    From Microsoft.WebApplication.targets file under MsBuild folder

    _CopyWebApplication
    
    This target will copy the build outputs along with the 
    content files into a _PublishedWebsites folder.
    
    This Task is only necessary when $(OutDir) has been redirected
    to a folder other than ~\bin such as is the case with Team Build.
    
    The original _CopyWebApplication is now a Legacy, you can still use it by 
     setting $(UseWPP_CopyWebApplication) to true.
    By default, it now change to use _WPPCopyWebApplication target in
     Microsoft.Web.Publish.targets.   
    It allow to leverage the web.config trsnaformation.
    
    0 讨论(0)
  • 2020-11-28 02:01

    You should be able to accomplish this by using the Package target and specifying the temp directory.

    msbuild solution.sln /p:Configuration=Release;DeployOnBuild=true;DeployTarget=Package;_PackageTempDir=..\publish
    

    http://pattersonc.com/blog/index.php/2010/07/15/visual-studio-2010-publish-command-from-msbuild-command-line/

    0 讨论(0)
提交回复
热议问题