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

Cut*_*ter 156 asp.net web-config visual-studio visual-studio-publish

可能重复:
如何在内置的visual studio调试器服务器中使用Web.debug.config?

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

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

任何的想法?

Say*_*imi 93

OK,以理解web.debug.configweb.release.config对于包/仅发布.我想出了一种方法来实现你想要做的事情.我在http://sedodream.com/2010/10/21/ASPNETWebProjectsWebdebugconfigWebreleaseconfig.aspx上发表过关于它的博客.这是摘要.

现在让我们看看我们如何能够提出问题者想要做的事情.

回顾一下,当他构建特定配置时,他希望应用特定的转换web.config.显然你不想维护一个web.config文件,因为它会被覆盖.

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

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

此外,我们不想使用web.debug.configweb.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相同的文件夹中的磁盘上,则它将自动导入到项目文件中.所以我创建了这个文件.我已经提出以下内容:

<?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>
Run Code Online (Sandbox Code Playgroud)

让我解释一下.我已经创建了CopyWebTemplateConfig目标,即使您没有在Visual Studio中调试应用程序,它也将始终复制web.template.configweb.config构建中.

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

在这个目标中,我使用正确的文件TransformXml来转换任务.之后,您的应用程序将根据您的构建配置使用正确的应用程序启动.之后我有另一个目标,我通过该属性注入到包/发布过程中.这是必需的,因为我们不希望在打包或发布应用程序时包含这些文件.所以这就是它的全部内容.web.template.configweb.dev.***.configweb.configExcludeCustomConfigTransformsFilesBeforeTargets=”ExcludeFilesFromPackage”

为此方案更多地解释包/发布过程.打包/发布时,web.debug.config或者web.release.config仍然会使用(取决于构建配置).但最终它正在转换的文件是web.template.config,所以你可能需要根据你在该文件中的内容进行调整.问题/评论?

  • 了解*.wpp.targets文件比转换实现更有价值.我一直在寻找类似的东西. (6认同)
  • 贡献很大.但是,实际上尝试了这一点后,我找到了关于保留web.debug.config和web.debug.release的解释,而没有将解决方案中包含的web.config文件(它需要)完全混淆.转换也不起作用?缓慢的猎豹,f5>变换>运行,也完全是误导,f5绑定调试NOT到Build. (3认同)
  • 您的解决方案令人费解,因为您正在解决以下事实:启动 IISExpress 以在项目文件夹中就地运行 Web,并且您无法转换,因为输出会破坏源 web.config。与其使用 web.template.config 进行所有这些脆弱且 IDE 不友好的业务,不如进行更改,以便在按下 F5 时:部署到文件夹,启动 IISExpress 为该文件夹提供服务,照常附加到 IISExpress。 (3认同)
  • 对于任何与此在VS的更高版本的挣扎,我不得不改变`<目标名称="CopyWebTemplateConfig" BeforeTargets ="构建">`来`<目标名称="CopyWebTemplateConfig" BeforeTargets ="PrepareForBuild">`而且它的所有工作之后. (3认同)
  • 迈克,我遇到了同样的问题.但是,当我删除<Target Name ="CopyWebTemplateConfig"/>节点时,它可以正常工作. (2认同)
  • @PeterWone关于`F5`部署到文件夹:然后你必须处理'性能,磁盘空间和清理'的影响,让你的图像和Javascripts,Css,或其他任何(可能是视频)复制到另一个地方之前你可以开始调试了. (2认同)

Say*_*imi 34

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

web.config 这是开发人员应在本地使用的配置文件.理想情况下,您应该将其标准化.例如,您可以将localhost用于数据库字符串,而不是.您应该努力在没有更改的情况下在dev计算机上工作.

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

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

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

  • 你说的是正确的,但在我看来,这个功能的设计是有限的.所有开发人员,在所有环境中,任何规模的团队都可能无法实现标准化的web.config(除了最简单的情况之外).在我看来,缺乏对本地构建的这个功能的支持是一个很大的耻辱. (13认同)
  • 在发布和调试模式之间切换始终会影响在本地运行应用程序.如果你1)将变换作为规则的例外使这个计数器直观, (4认同)
  • 此外,为什么转换的破坏性质存在问题... web.config和转换都应该在SC中.每个需要不同配置的环境都应该拥有自己的转换,例如web.config,web.devgroup1.config,web.devgroup2.config,web.staging.config web.production.config等.所以虽然web.config会改变,但什么都不会丢失,获取最新的+版本将导致该环境的正确web.config,没有任何损失. (4认同)
  • 我同意@MemeDeveloper的观点,在团队中所有开发人员之间使用标准化的web.config的想法是完全不现实的。Microsoft应该创建一个解决方案,使开发人员可以在web.config中拥有自己的设置,而不会影响将web.config检入源代码管理。 (2认同)
  • 当相应的配置处于活动状态时,这些配置转换不会应用于调试器,这是疯狂的.就像AaronLS所说,这是一个非常反直觉的例外规则. (2认同)

And*_*ber 29

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

  • 这在多开发人员环境中并不总是有效(例如,想想连接字符串). (41认同)
  • 有时我需要针对我们的集成或登台数据库而不是通常的开发数据库进行调试.在运行VS的调试器时应用适当的转换会非常有帮助. (4认同)
  • V.类似Ben的观点...多个开发环境如何,我使用三种不同的Dev PC,用于测试不同的浏览器等,不断需要改变各种配置以针对不同的这些不同的设置. (3认同)
  • @BenCollins是对的.每当您需要更改连接字符串以进行调试时,您需要实际更改web.config.除非您记得在签入之前还原更改,否则可能会导致源代码管理中对web.config文件进行不需要的修订.如果在构建时应用了web.debug.config,则可以在源代码管理中忽略此文件,以允许开发人员自定义其配置,而无需担心web.config上的多余修订. (3认同)
  • 这是一个相当懒惰的答案,我在多开发环境中工作,这种方法不起作用 (2认同)

Mit*_*eat 18

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


小智 13

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

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

  • post build事件转换Web配置的语法是什么? (4认同)