当我创建部署包时发生了web.config
变化,但我不明白这部分:
我有两个web.config
转换文件,web.debug.config
和web.release.config
.
这些转换文件是否仅在我们进行 Web 部署或部署包时可用或工作?web.config
当项目从 Visual Studio 本地运行时(例如通过 IIS Express),是否不使用转换?
当我创建部署包时发生了web.config
变化,但我不明白这部分:
我有两个web.config
转换文件,web.debug.config
和web.release.config
.
这些转换文件是否仅在我们进行 Web 部署或部署包时可用或工作?web.config
当项目从 Visual Studio 本地运行时(例如通过 IIS Express),是否不使用转换?
你是对的。
部署或运行部署包时会应用配置转换。
它们不会在编译时转换。
如果您在编译过程中需要转换后的配置文件,您可以通过编辑项目文件 (.csproj) 并添加以下代码来获取它。
<Target Name="AfterBuild">
<TransformXml Source="$(SolutionDir)WCFServices\Web.config"
Transform="$(SolutionDir)WCFServices\Web.Release.config"
Destination="$(OutDir)WebRelease.config"
StackTrace="true" />
</Target>
可以添加多个 TransformXml 标签来获取所有需要的配置文件。此外,这可以在构建之前或之后完成。
您可以使用 MSBuild 和一个名为 SlowCheetah 的扩展来调用它。
还有一个名为Configuration Transform的 VS 扩展对此很有用。如果您不想安装它,但要实现此目的,只需按照演示解决方案中显示的示例添加不同的构建配置文件并在项目文件中添加一些新的 MSBuild 任务。演示解决方案的下载链接可以在扩展的 Visual Studio Gallery 网页上找到。这种方法不需要任何额外的包,因为 MSBuild 使用 XSLT 进行 XML 转换。
下面是从演示解决方案添加到项目文件中的 MSBuild 任务。就我而言,当我关注它进行 VS2015 ASP.NET MVC 项目时,我不必投入<UsingTask TaskName="TransformXml" AssemblyFile=...
。
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
<Target Name="AfterCompile" Condition="Exists('App.$(Configuration).config')">
<!--Generate transformed app config in the intermediate directory-->
<TransformXml Source="App.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="App.$(Configuration).config" />
<!--Force build process to use the transformed configuration file from now on.-->
<ItemGroup>
<AppConfigWithTargetPath Remove="App.config" />
<AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
<TargetPath>$(TargetFileName).config</TargetPath>
</AppConfigWithTargetPath>
</ItemGroup>
</Target>
<!--Override After Publish to support ClickOnce AfterPublish. Target replaces the untransformed config file copied to the deployment directory with the transformed one.-->
<Target Name="AfterPublish">
<PropertyGroup>
<DeployedConfig>$(_DeploymentApplicationDir)$(TargetName)$(TargetExt).config$(_DeploymentFileMappingExtension)</DeployedConfig>
</PropertyGroup>
<!--Publish copies the untransformed App.config to deployment directory so overwrite it-->
<Copy Condition="Exists('$(DeployedConfig)')" SourceFiles="$(IntermediateOutputPath)$(TargetFileName).config" DestinationFiles="$(DeployedConfig)" />
</Target>
这是我在 .csproj 文件中应用的方式,非常简单:
<Target Name="AfterBuild" Condition="Exists('Web.$(Configuration).config')">
<Exec Command="attrib -R Web.config" />
<TransformXml Source="Web.config" Transform="Web.$(Configuration).config" Destination="Web.config" StackTrace="true" />
</Target>
在这方面也有一个很好的帖子。
此外,对于 web.config 转换,由于 VS2012我们可以添加一个发布配置文件 - Publish.pubxml ( ProjectFolder /Properties/PublishProfiles/Publish.pubxml) 来进行文件系统发布,因此 web.config 转换将默认发生。下面是一个示例
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<SiteUrlToLaunchAfterPublish />
<publishUrl Condition="$(OutDir) != ''">$(OutDir)\_PublishedWebsites\$(ProjectName)</publishUrl> <!-- For MSBuild -->
<publishUrl Condition="$(OutDir) == ''">$(MSBuildThisFileDirectory)..\..\_PublishedWebsite\</publishUrl> <!-- For Visual Studio...cant use $(ProjectName) -->
<DeleteExistingFiles>True</DeleteExistingFiles>
</PropertyGroup>
</Project>