Cut*_*ter 156 asp.net web-config visual-studio visual-studio-publish
我想使用Web.config转换,该转换适用于发布也适用于调试.
当我发布Web应用程序时,Visual Studio会根据我的currenctbuild配置自动转换Web.config.当我开始调试时,如何告诉Visual Studio执行相同的操作?在调试启动时,它只使用默认的Web.config而不进行转换.
任何的想法?
Say*_*imi 93
OK,以理解web.debug.config和web.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.config或web.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>
让我解释一下.我已经创建了CopyWebTemplateConfig目标,即使您没有在Visual Studio中调试应用程序,它也将始终复制web.template.config到web.config构建中.
这是必需的,因为我们仍然需要支持Visual Studio的包/发布过程.然后我扩展了属性PrepareForRunDependsOn以包含UpdateWebConfigBeforeRun目标.此属性用于标识在从Visual Studio运行任何托管项目之前需要执行的目标列表.
在这个目标中,我使用正确的文件TransformXml来转换任务.之后,您的应用程序将根据您的构建配置使用正确的应用程序启动.之后我有另一个目标,我通过该属性注入到包/发布过程中.这是必需的,因为我们不希望在打包或发布应用程序时包含这些文件.所以这就是它的全部内容.web.template.configweb.dev.***.configweb.configExcludeCustomConfigTransformsFilesBeforeTargets=”ExcludeFilesFromPackage”
为此方案更多地解释包/发布过程.打包/发布时,web.debug.config或者web.release.config仍然会使用(取决于构建配置).但最终它正在转换的文件是web.template.config,所以你可能需要根据你在该文件中的内容进行调整.问题/评论?
Say*_*imi 34
安德鲁走在正确的道路上.当您使用此功能时,它是如何设计使用的.
web.config 这是开发人员应在本地使用的配置文件.理想情况下,您应该将其标准化.例如,您可以将localhost用于数据库字符串,而不是.您应该努力在没有更改的情况下在dev计算机上工作.
web.debug.config 这是将应用程序发布到开发登台环境时应用的转换.这将更改目标环境所需的web.config.
web.release.config 这是将应用程序发布到"生产"环境时应用的转换.显然,根据您的应用程序/团队,您必须小心密码.
转换当前运行的web.config的问题是转换可以对web.config执行破坏性操作.例如,它可能会删除属性,删除元素等.
And*_*ber 29
您可以使用'default'web.config作为开发/调试版本,然后web.release.config当然将继续作为发行版本,因为它的发布时会应用它的转换.
小智 13
虽然我同意最简单的方法通常是最好的,但我可以很容易地想象出一段时间你想要将IDE连接到测试数据库而不是开发数据库的情况.虽然您可以在默认的web.config文件中指定开发连接字符串,但是拥有一个Web.Test.config文件非常好,这样当您将构建配置交换为"Test"时,您将自动获得新设置还在你的IDE中.
历史的另一种选择是为另一组连接字符串注释掉,但是这些新的配置转换仍然希望最终将这个丑陋的实践放在心中.虽然一个用于开发的默认文件和一个用于发布的转换可能在很多时候都可以工作,但在我看来,添加一个构建后步骤来转换web.config文件是更完整的答案.
| 归档时间: | 
 | 
| 查看次数: | 81774 次 | 
| 最近记录: |