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

时间:2013-06-14 11:29:56

标签: asp.net web-config aspnet-compiler

我是否需要设置debug='false'

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

即使以发布模式发布我的代码。

编辑1

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

  1. 在第一阶段,将代码编译为一个或多个程序集
  2. 在第二个方面将MSIL转换为运行应用程序的计算机上处​​理器的CPU特定说明
  3. 发布代码是指第1阶段和第1部分 <compilation ....表示第2阶段。

6 个答案:

答案 0 :(得分: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库的调试版本有很多检查(参数验证等),这些检查从脚本的发行版本中删除。这就是调试版本工作缓慢的原因。

答案 1 :(得分: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 :(得分:1)

对于debug=true vs debug=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属性1}}标记,它将使应用程序发布并关闭调试。

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

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

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

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

答案 3 :(得分:1)

理论

This article from 2006列出了debug="true"

的效果
  1. ASP.NET请求不会超时:出于明显的调试目的
  2. 批量编译已关闭:页面和控件已编译为单独的程序集
  3. 代码优化:JIT编译器生成更高效的代码
  4. Number 3.与Release模式编译基本相同。

    代码参考

    为了进行更多调查,我在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
    7. 这些似乎都与上面提到的3点有关。

      运行时效果

      请注意,调试标志会影响

      1. 动态编译
      2. 预编译(wdproj
      3. MSDeploy
      4. 虽然净效果基本相同,但更改标志对任何即时编译的代码(如使用wdproj预编译)都没有优化效果。

        捆绑

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

答案 4 :(得分:1)

您无需指定debug =&#34; false&#34;。你可以省略它并离开

<compilation targetFramework="4.5" /> 

IIS asumes debug为false。

答案 5 :(得分:0)

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