编译debug =“true”和发布模式“release”之间是否有任何关系?

问题描述 投票:6回答:6

我需要设置debug='false'

<compilation debug="false" targetFramework="4.0" /> 

即使在发布模式下发布我的代码。

编辑1

正如MSDN编译概述中所述,它是在两个阶段完成的

  1. 在第一阶段,它将代码编译为一个或多个程序集
  2. 在第二阶段,将MAIL转换为运行应用程序的计算机上处​​理器的CPU特定指令

发布代码是指第1阶段和 <compilation ....指第2阶段。

asp.net web-config aspnet-compiler
6个回答
6
投票

我不完全理解你的问题。如果您询问手动需要设置debug ='false',那么如果项目中存在包含配置转换的文件,则答案将取决于事实。当前的Visual Studio标准Web项目模板包括两个带有配置转换的文件:Web.Debug.config和Web.Release.config。这些文件包含在发布代码期间应用的配置转换。这是默认Web.Release.config文件的示例:

<?xml version="1.0"?>

<!-- For more information on using web.config transformation visit http://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an atrribute "name" that has a value of "MyDB".

    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->

    <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.

      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration> 

因此,如果您有Web.Release.config转换文件,其内容与上述类似,并且您使用Visual Studio的发布功能(或根据msbuild目标),那么当您在发布中发布项目时,将删除debug ='true'属性模式。

从web配置中删除debug ='true'有很多好处。此设置不仅会影响已编译的dll,还会影响将加载的MS Ajax脚本版本(如果使用ASP.NET Web窗体和脚本管理器控件)。 MS Ajax库的调试版本有很多检查(参数验证等),这些检查从脚本的发行版本中删除。这就是调试版本运行缓慢的原因。


3
投票

是的,您需要使用debug =“false”。

ASP .Net解析.aspx或视图,并创建一些与您使用Visual Studio编译的dll不同的dll。此设置适用于这些dll。

ASP.NET编译概述http://msdn.microsoft.com/en-us/library/ms178466(v=vs.100).aspx


2
投票

对于debug=truedebug=false的讨论,生产系统在发布到生产时关闭调试有很多好处。其他答案和评论更详细(我在MVC4应用程序中注意到的一个很大优势是,当调试关闭时,JS和CSS捆绑包会缩小)。

关于以Release模式发布的问题,请阅读以下内容:

如果您正在使用新ASP.NET项目附带的现成转换文件,那么不需要手动设置它。但是,如果您没有转换文件或者您没有使用它们,那么在发布到生产时,您应该更改该设置。

基本上,当您发布ASP.NET网站时,它所做的是构建应用程序,应用适当的web.config转换(基于使用“发布Web”功能时在“设置”部分中选择的配置 - 我假设您正在选择“发布”模式,然后将代码发布到指定位置。

通常,为了让您开始进行转换,在Visual Studio中创建ASP.NET应用程序时,将为您的web.config提供两个转换:web.Debug.configweb.Release.config(您可以通过单击Web旁边的展开符号来查看它们.config文件)。

如果您没有任何转换,可以通过右键单击web.config文件并选择“Add Transform Config”来创建它们,并为您解决方案中的各种构建配置创建转换文件。

正如Maxim Kornilov在回答中提到的那样,开箱即用web.Release.config包含这个重要的转换行:<compilation xdt:Transform="RemoveAttributes(debug)" />,它告诉应用程序从debug标签中删除<compilation属性,这将使应用程序发布并关闭调试。

注意:如果在发布时没有在配置转换中看到RemoveAttributes(debug),则代码可能会以调试模式发布。

如果您真的想确定转换是如何工作的,请在发布后查看web.config的内容,然后您将看到转换的输出

此外,http://webconfigtransformationtester.apphb.com/上还有一个工具可以让您测试web.config转换将如何影响您的web.config文件。

最后,我非常喜欢使用构建服务器和构建来在它准备好上线时发布我的代码(更少的人需要直接访问服务器),所以web.config转换帮助了我很多,允许我根据我正在部署的环境更改连接字符串,以及管理不同环境的警告消息等(例如,警告:测试系统,不要输入实际数据)。通过使用转换,主要的设置集合可以保留在web.config文件中(以及本地开发设置,因为命中F5通常不应用转换,除非您在本地发布以进行测试),并且每个环境都有自己的配置转换位于源代码控制中,并且使用相同的分支,代码可以轻松部署到多个环境,而无需更改任何代码。


1
投票

理论

This article from 2006列出了debug="true"的影响:

  1. ASP.NET请求不会超时:出于明显的调试目的
  2. 批量编译已关闭:页面和控件将编译为单独的程序集
  3. 代码优化:JIT编译器生成更高效的代码

数字3.与发布模式编译的基本相同。

代码参考

为了进行更多的调查,我在我的一个关于Framework 4.0的Web项目中发布了关于System.Web.Configuration.CompilationSection.Debug的Re#。找到的用法是:

  1. System.Web.Configuration.BrowserCapabilitiesCodeGenerator.GenerateAssembly
  2. System.Web.Configuration.CompilationSection.GetCompilerInfoFromExtension
  3. System.Web.Configuration.CompilationSection.GetCompilerInfoFromLanguage
  4. System.Web.Compilation.CompilationUtil.GetRecompilationHash
  5. System.Web.HttpRuntime.InitDebuggingSupport
  6. System.Web.Compilation.CompilationUtil.IsDebuggingEnabled

这些似乎都与上面提到的3点有关。

运行时效果

请注意,调试标志会影响

  1. 即时编译
  2. 预编译(由wdproj提供)
  3. MSDeploy

虽然净效果大致相同,但更改标志对任何未动态编译的代码(如使用wdproj预编译)没有优化效果。

捆绑

此外,调试标志至少还有一个用途:使用resource bundles。当app / web配置中的调试标志打开时,捆绑的JS和CSS将不加改变地输出。


1
投票

您不需要指定debug =“false”。你可以省略它并离开

<compilation targetFramework="4.5" /> 

IIS假定debug为false。


0
投票

你应该。 debug="true"开关只应在开发过程中使用。

© www.soinside.com 2019 - 2024. All rights reserved.