首页 文章

使用Visual Studio web.config转换进行调试[复制]

提问于
浏览
145

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

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

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

任何的想法?

5 回答

  • 31

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

  • 13

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

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

  • 17

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

  • 28

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

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

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

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

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

  • 89

    好的,理解 web.debug.configweb.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.configweb.release.config ,因为这些已经在Web Publishing Pipeline中有明确定义的角色,所以我们不想打扰它 . 因此,我们将在与项目相同的文件夹中创建两个新文件 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 ,因此您可能需要根据该文件中的内容进行调整 . 问题/评论?

相关问题