在调试配置中,添加一个生成后步骤,并使用它替换/转换 web.config

您可以只使用“ default”web.config 作为开发/调试版本,然后 web.release. config 当然将继续作为发布版本,因为它的转换将在您发布时应用。

尽管我同意最简单的方法通常是最好的,但是我可以很容易地想象这样一种情况: 在一段时间内,您希望将 IDE 连接到测试数据库,而不是开发数据库。尽管您可以在默认的 Web.config 文件中指定开发连接字符串,但是拥有一个 Web 还是很不错的。Config 文件,这样当您将构建配置交换到“ Test”时,您将在 IDE 中自动获得新的设置。

历史上的替代方法是将一组连接字符串注释为另一组,但是这些新的配置转换为最终在这个丑陋实践的核心中加入一个木桩提供了希望。虽然一个用于开发的默认文件和一个用于发布的转换在大多数情况下都可以正常工作,但是在我看来,添加一个构建后步骤来转换 web.config 文件才是更完整的答案。

安德鲁在正确的道路上。当您在使用这个特性时,这里将介绍它的设计原理。

Web.config 这是开发人员应该在本地使用的配置文件。理想情况下,您应该使这个标准化。例如,您可以对 DB 字符串使用 localhost,或者不使用。您应该努力做到这一点,以便在开发机器上工作而不进行更改。

Config 这是在将应用程序发布到开发临时环境时应用的转换。这将对目标环境所需的 web.config 进行更改。

Web.release. config 这是在将应用程序发布到“生产”环境时应用的转换。显然,您必须根据您的应用程序/团队小心使用密码。

转换当前运行的 web.config 的问题在于,转换可能会对 web.config 执行破坏性操作。例如,它可以删除属性、删除元素等。

好的,请理解 web.debug.configweb.release.config仅用于软件包/发布。我已经想出了一个办法,可以使你正在努力做的事情成为可能。我在 https://devblogs.microsoft.com/aspnet/asp-net-web-projects-web-debug-config-web-release-config/的博客上写过。 这是总结。

现在让我们看看如何启用提问者想要做的事情。

简而言之,当他构建一个特定的配置时,他希望将一个特定的转换应用到 web.config。所以显然你不想维护一个 web.config文件,因为它将被覆盖。

所以我们需要做的是创建一个新文件 web.template.config,它只是 web.config的一个副本。然后使用文件资源管理器删除 web.config(不要使用 Visual Studio 删除,因为我们不想从项目中删除它)。

注意: 如果您使用的是集成到 Visual Studio 中的源代码管理提供程序,那么您可能希望从源代码管理中删除 web.config。

另外,我们不希望使用 web.debug.configweb.release.config,因为它们在 Web 发布管道中已经有了一个定义良好的角色,所以我们不希望干扰它们。因此,我们将创建两个新的文件,在同一个文件夹作为项目和 web.template.configweb.dev.debug.configweb.dev.release.config

其思想是,这些将是在 VisualStudio 中调试或运行应用程序时应用的转换。现在,我们需要连接到构建/包/发布过程中,以便将这些内容连接起来。使用 Web 应用程序项目(Web Application Projects,WAP)有一个扩展点,您可以在同一文件夹中创建一个名为 {ProjectName}.wpp.targets的项目文件,其中 {ProjectName}是项目的名称。如果这个文件与 WAP 在同一个文件夹中,那么它将自动导入到项目文件中。所以我创建了这个文件。我已经放置了以下内容:

<?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>

让我解释一下。我已经创建了 CopyWebTemplateConfig 目标,它将始终在生成时将 web.template.config复制到 web.config,即使您没有在 VisualStudio 中调试应用程序。

这是必需的,因为我们仍然需要支持 VisualStudio 的包/发布过程。然后我扩展了属性 PrepareForRunDependsOn以包括 UpdateWebConfigBeforeRun目标。此属性用于标识在从 VisualStudio 运行任何托管项目之前需要执行的目标列表。

在这个目标中,我使用 TransformXml任务来转换 web.template.config,使用正确的 web.dev.***.config文件。之后,您的应用程序开始使用正确的 web.config基于您的构建配置。 之后,我有了另一个目标 ExcludeCustomConfigTransformsFiles,我通过属性 BeforeTargets=”ExcludeFilesFromPackage”将它注入包/发布过程。这是必需的,因为我们不希望在打包或发布应用程序时包含这些文件。 所以这就是全部了。

为此场景进一步解释包/发布过程。当您打包/发布 web.debug.configweb.release.config时,依赖于构建配置,仍将使用。但是最终它要转换的文件是 web.template.config,因此您可能必须根据文件中的内容进行调整。问题/评论?