如何使用Visual Studio网站项目进行Web.config转换?

时间:2011-02-22 18:16:56

标签: visual-studio visual-studio-2010 web-config

change the Build Configuration of Visual Studio 2010 Website Projects似乎不可能(与Visual Studio Web应用程序相对),更改构建配置是启用Web.config转换的关键部分(无法更改配置)除了调试之外的任何事情。

如果无法更改构建配置,如何让Web.config转换与Visual Studio 2010网站项目一起使用?

6 个答案:

答案 0 :(得分:9)

我不想完全使用整个Web应用程序项目解决方案。 我的解决方案是直接使用Microsoft.Web.Publishing.Tasks.dll中定义的XmlTransform任务(此任务是WebConfigTransformation的核心) 这种方式足够灵活,完全符合您的预期。 例如,这里是我用来转换web.config的WebSiteTransformator.csproj。

这里也是原始WebConfigTransformation无法实现的灵活性示例:它需要web.Template.config,将web。$(Configuration).config应用于它并写入web.config。这允许我们将web.config本身添加到源代码管理中的忽略列表中。网站引用它仍然是有效的csproj:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <SchemaVersion>2.0</SchemaVersion>
    <OutputType>Library</OutputType>
    <TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
    <OutputPath>$(TEMP)\TransformWebConfig\bin</OutputPath>
    <BaseIntermediateOutputPath>$(TEMP)\TransformWebConfig\obj\</BaseIntermediateOutputPath>
    <IntermediateOutputPath>$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
    <WebFolderName>$(SolutionDir)\MyWebSite\</WebFolderName>
  </PropertyGroup>
  <ItemGroup>
    <Compile Include="Dummy.cs" />
  </ItemGroup>
  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <Target Name="BeforeBuild">
    <TransformXml Source="$(WebFolderName)Web.Template.config"
                  Transform="$(WebFolderName)Web.$(Configuration).config"
                  Destination="$(WebFolderName)Web.config" />
  </Target>
</Project>

答案 1 :(得分:6)

我发现了一篇很好的博客文章,在这里描述了一个解决方案: http://andrewtwest.com/2010/02/25/using-web-config-transformations-in-web-site-projects/

简而言之:在包含网站的解决方案中创建一个空项目(只要它不是另一个网站项目)。空项目将允许您通过其项目文件访问msbuild,这将允许您在您的网站web.config上执行转换。

答案 2 :(得分:4)

我使用了一种稍微替代的方法。仍然有点黑客,但我认为更直接。这对我有用,但显然有很多不同的配置可用,所以我不能保证它对每个人都有效。这是围绕网站首次打包到您的AppData文件夹中的方式...

  1. 手动将Web.Release.config文件添加到网站并添加必要的转换 - 显然网站没有“添加配置转换”选项,因此必须手动执行此操作。示例Web.Release.config:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
        <appSettings>
            <add key="MySetting" value="NewValue" xdt:Transform="Replace" xdt:Locator="Match(key)" />
        </appSettings>
        <system.web>
            <compilation xdt:Transform="RemoveAttributes(debug)" />
        </system.web>
    </configuration>
    
  2. website.publishproj文件中,确保配置设置为Release:

    <Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
    
  3. 将以下内容添加到website.publishproj的最底部(就在</Project>之前):

    <Target Name="AfterBuild">
      <MakeDir Directories="$(PackageArchiveRootDir)\..\CSAutoParameterize\original" />
      <TransformXml Source="Web.config" Transform="Web.$(ConfigurationName).config" Destination="$(PackageArchiveRootDir)\..\CSAutoParameterize\original\Web.config" StackTrace="false" />
    </Target>
    

答案 3 :(得分:2)

如上面Andriy的评论所述,Solution wide build events看起来似乎是一种更清洁的方式。

我将此作为一个单独的答案添加,因为它在评论中有点迷失,但恕我直言是最好的答案。 Andriy K和Sayed Ibrahim的道具。

答案 4 :(得分:2)

在VS 2017中创建一个发布配置文件,然后右键单击App_Data \ PublishProfiles中的.pubxml配置文件,然后选择“添加配置转换”。

请参见https://social.msdn.microsoft.com/Forums/vstudio/en-US/31f41991-abb2-41de-ad0b-c1379cc7c806/vs-2013-express-for-web-webconfig-transforms?forum=visualstudiogeneral&prof=required

答案 5 :(得分:1)

如果您不想使用Web.Template.config,我使用了这个:

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

<Copy SourceFiles="$(ProjectDir)Web.config" DestinationFiles="$(_tempSourceFile)"/>
<Copy SourceFiles="$(ProjectDir)Web.$(Configuration).config" DestinationFiles="$(_tempTransformFile)"/>

<TransformXml Source="$(_tempSourceFile)"
              Transform="$(_tempTransformFile)"
              Destination="$(ProjectDir)Web.config"
              StackTrace="false" />

改编自答案here