Note: If you are using a source control provider which is integrated into Visual Studio then you probably want to delete web.config from source control.
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<!-- Make sure web.config will be there even for package/publish -->
<Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
<Copy SourceFiles="web.template.config"
DestinationFiles="web.config"/>
</Target>
<PropertyGroup>
<PrepareForRunDependsOn>
$(PrepareForRunDependsOn);
UpdateWebConfigBeforeRun;
</PrepareForRunDependsOn>
</PropertyGroup>
<!-- This target will run right before you run your app in Visual Studio -->
<Target Name="UpdateWebConfigBeforeRun">
<Message Text="Configuration: $(Configuration): web.dev.$(Configuration).config"/>
<TransformXml Source="web.template.config"
Transform="web.dev.$(Configuration).config"
Destination="web.config" />
</Target>
<!-- Exclude the config template files from the created package -->
<Target Name="ExcludeCustomConfigTransformFiles" BeforeTargets="ExcludeFilesFromPackage">
<ItemGroup>
<ExcludeFromPackageFiles Include="web.template.config;web.dev.*.config"/>
</ItemGroup>
<Message Text="ExcludeFromPackageFiles: @(ExcludeFromPackageFiles)" Importance="high"/>
</Target>
</Project>
5 回答
在您的调试配置中,添加一个构建后的步骤,并使用它来替换/转换您的
web.config
虽然我同意最简单的方法通常是最好的,但我可以很容易地想象出一段时间你想要将IDE连接到测试数据库而不是开发数据库的情况 . 虽然您可以在默认的web.config文件中指定开发连接字符串,但是拥有一个Web.Test.config文件非常好,这样当您将构建配置交换为“Test”时,您将自动获得新设置还在你的IDE中 .
历史的替代方案是为另一个连接字符串注释掉一组连接字符串,但是这些新的配置转换仍然希望最终将利益放在那个丑陋的实践的核心 . 虽然一个用于开发的默认文件和一个用于发布的转换可能在很多时候都有效,但在我看来,添加一个构建后步骤来转换web.config文件是更完整的答案 .
您可以使用'default'web.config作为开发/调试版本,然后web.release.config当然将继续作为发布版本,因为它的发布时会应用它的转换 .
安德鲁正走在正确的道路上 . 当您使用此功能时,它是如何设计使用的 .
web.config 这是开发人员应在本地使用的配置文件 . 理想情况下,您应该将其标准化 . 例如,您可以将localhost用于DB字符串,而不是 . 您应该努力在没有更改的情况下在dev计算机上工作 .
web.debug.config 这是将应用程序发布到开发登台环境时应用的转换 . 这将更改目标环境所需的web.config .
web.release.config 这是将应用程序发布到"production"环境时应用的转换 . 显然,根据您的应用程序/团队,您必须小心密码 .
转换当前运行的web.config的问题是转换可以对web.config执行破坏性操作 . 例如,它可能会删除属性,删除元素等 .
好的,理解
web.debug.config
&web.release.config
仅用于打包/发布 . 我想出了一种方法来实现你想要做的事情 . 我在http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx上发表过关于它的博客 . 这是摘要 .现在让我们看看我们如何能够提出问题者想要做的事情 .
回顾一下,当他构建特定配置时,他希望将特定变换应用于
web.config
. 显然你不想维护一个web.config
文件,因为它会被覆盖 .所以我们需要做的是创建一个新文件
web.template.config
,它只是web.config
的副本 . 然后使用Windows资源管理器删除web.config
(不要使用Visual Studio删除,因为我们不想从项目中删除它) .Note: If you are using a source control provider which is integrated into Visual Studio then you probably want to delete web.config from source control.
另外,我们不想使用
web.debug.config
或web.release.config
,因为这些已经在Web Publishing Pipeline中有明确定义的角色,所以我们不想打扰它 . 因此,我们将在与项目相同的文件夹中创建两个新文件web.template.config
,web.dev.debug.config
和web.dev.release.config
.我们的想法是,这些将是从Visual Studio调试或运行应用程序时应用的转换 . 现在我们需要挂钩构建/打包/发布过程,以便全部连线 . 使用Web应用程序项目(WAP),有一个可扩展点,您可以在名为
{ProjectName}.wpp.targets
的同一文件夹中创建项目文件,其中{ProjectName}
是项目的名称 . 如果此文件位于与WAP相同的文件夹中的磁盘上,则它将自动导入到项目文件中 . 所以我创建了这个文件 . 我已经提出以下内容:让我解释一下 . 我创建了CopyWebTemplateConfig目标,即使您没有在Visual Studio中调试应用程序,也会在构建时将
web.template.config
复制到web.config
.这是必需的,因为我们仍然需要支持Visual Studio的包/发布过程 . 然后我扩展了属性
PrepareForRunDependsOn
以包含UpdateWebConfigBeforeRun
目标 . 此属性用于标识在从Visual Studio运行任何托管项目之前需要执行的目标列表 .在这个目标中我使用
TransformXml
任务进行转换web.template.config
,使用正确的web.dev.***.config
文件 . 之后,您的应用程序将根据您的构建配置使用正确的web.config
启动 . 之后我有另一个目标ExcludeCustomConfigTransformsFiles
,我通过属性BeforeTargets=”ExcludeFilesFromPackage”
注入到包/发布过程中 . 这是必需的,因为我们不希望在打包或发布应用程序时包含这些文件 . 所以这就是它的全部内容 .为此方案更多地解释包/发布过程 . 打包/发布
web.debug.config
或web.release.config
时,仍将使用,具体取决于构建配置 . 但最终它正在转换的文件是web.template.config
,因此您可能需要根据该文件中的内容进行调整 . 问题/评论?