可能重复:
如何在内置的Visual Studio调试器服务器中使用Web.debug.config?
我想要使用在发布时正常工作的Web.config转换来进行调试。
当我发布Web应用程序时,Visual Studio会根据当前的构建配置自动转换Web.config
。
如何告诉Visual Studio在开始调试时执行相同的操作?
在调试启动时,它仅使用默认的Web.config
而没有进行转换。
有任何想法吗?
可能重复:
如何在内置的Visual Studio调试器服务器中使用Web.debug.config?
我想要使用在发布时正常工作的Web.config转换来进行调试。
当我发布Web应用程序时,Visual Studio会根据当前的构建配置自动转换Web.config
。
如何告诉Visual Studio在开始调试时执行相同的操作?
在调试启动时,它仅使用默认的Web.config
而没有进行转换。
有任何想法吗?
了解到web.debug.config
和web.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
的副本。然后通过Windows资源管理器删除web.config
(不要使用Visual Studio删除,因为我们不希望从项目中删除它)。
注意:如果您使用的是集成在Visual Studio中的源代码控制提供程序,则可能需要从源代码控制中删除web.config。
此外,我们不想使用web.debug.config
或web.release.config
,因为它们已在Web发布管道中具有明确定义的角色,所以我们不想扰乱它。相反,我们将创建两个新文件,与项目和web.template.config
位于同一文件夹中,即web.dev.debug.config
和web.dev.release.config
。
这些文件的想法是,在使用Visual Studio进行调试或运行应用程序时将应用这些转换。现在,我们需要连接到生成/打包/发布过程中,来实现这一切。对于Web应用程序项目(WAP),可以创建一个名为{ProjectName}.wpp.targets
的项目文件,与项目名称相同,放置在同一文件夹中,作为可扩展性点。如果此文件与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
,即使您没有在Visual Studio中调试应用程序。
这是必要的,因为我们仍然需要支持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
,因此您可能需要根据该文件中包含的内容进行调整。有问题/评论吗?
<Target Name="CopyWebTemplateConfig" BeforeTargets="Build">
改为<Target Name="CopyWebTemplateConfig" BeforeTargets="PrepareForBuild">
然后问题就会解决了。 - Matti Price安德鲁正在走上正确的道路。当您使用此功能时,它的设计方式如下。
web.config 这是开发人员应在本地使用的配置文件。理想情况下,您应该将其标准化。例如,您可以将 localhost 用于 DB 字符串等。您应该努力使其在开发机器上无需更改即可正常工作。
web.debug.config 这是在将应用程序发布到开发暂存环境时应用的转换。这将更改为目标环境所需的 web.config。
web.release.config 这是在将应用程序发布到“生产”环境时应用的转换。显然,根据您的应用程序/团队,您必须小心密码。
转换当前正在运行的 web.config 的问题在于,转换可能对 web.config 执行破坏性操作。例如,它可能会删除属性、删除元素等。
你可以使用“默认”web.config作为你的开发/调试版本,而web.release.config显然仍然是发布版本,因为它的变换是在发布时应用的。
在您的调试配置中,添加一个构建后步骤,并使用它来替换/转换您的 web.config
。
web.config
,请确保您不会永久丢失最终需要的设置。要知道这实际上正在做什么。任何 web.Debug.config
对 web.config
进行的永久转换,您必须确保您的 web.Release.config
修复所有问题。 - Doug S