change the Build Configuration of Visual Studio 2010 Website Projects似乎不可能(与Visual Studio Web应用程序相对),更改构建配置是启用Web.config转换的关键部分(无法更改配置)除了调试之外的任何事情。
如果无法更改构建配置,如何让Web.config转换与Visual Studio 2010网站项目一起使用?
答案 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
文件夹中的方式...
手动将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>
在website.publishproj
文件中,确保配置设置为Release:
<Configuration Condition=" '$(Configuration)' == '' ">Release</Configuration>
将以下内容添加到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配置文件,然后选择“添加配置转换”。
答案 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。