使用Visual Studio web.config转换进行调试

时间:2010-10-13 09:27:35

标签: asp.net visual-studio web-config visual-studio-publish

  

可能重复:
  How can I use Web.debug.config in the built-in visual studio debugger server?

我想使用Web.config转换,该转换适用于发布也适用于调试。

当我发布Web应用程序时,Visual Studio会根据我的currenctbuild配置自动转换Web.config。 当我开始调试时,如何告诉Visual Studio执行相同的操作? 在调试启动时,它只使用默认的Web.config而不进行转换。

有什么想法吗?

5 个答案:

答案 0 :(得分:91)

好的,理解为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删除,因为我们不想从项目中删除它)。

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

此外,我们不想使用web.debug.configweb.release.config,因为这些已经在Web发布管道中具有明确定义的角色,因此我们不想打扰它。因此,我们将在与项目相同的文件夹中创建两个新文件,web.template.configweb.dev.debug.configweb.dev.release.config

这个想法是,这些将是从Visual Studio调试或运行应用程序时应用的转换。现在我们需要挂钩构建/打包/发布过程,以便将所有内容连接起来。使用Web应用程序项目(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目标,即使您没有在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.configweb.release.config时,仍会使用,具体取决于构建配置。但最终它正在转换的文件是web.template.config,因此您可能需要根据该文件中的内容进行调整。问题/评论

答案 1 :(得分:33)

安德鲁正走在正确的道路上。当您使用此功能时,它是如何设计使用的。

<强>的web.config 这是开发人员应在本地使用的配置文件。理想情况下,您应该将其标准化。例如,您可以将localhost用于数据库字符串,而不是。你应该努力使这个在dev机器上工作而不做任何改变。

<强> web.debug.config 这是将应用程序发布到开发登台环境时应用的转换。这将更改目标环境所需的web.config。

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

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

答案 2 :(得分:29)

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

答案 3 :(得分:18)

在您的调试配置中,添加一个构建后的步骤,并使用它来替换/转换您的web.config

答案 4 :(得分:13)

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

历史的替代方案是为另一个连接字符串注释掉一组连接字符串,但是这些新的配置转换仍然希望最终将这个连接字符串放在那个丑陋的实践中。虽然一个用于开发的默认文件和一个用于发布的转换可能在很多时候都可以工作,但在我看来,添加一个构建后步骤来转换web.config文件是更完整的答案。