如何在发布模式下设置调试为false

31

我有一个 web.config 文件,其中编译选项设置如下:

Web.config

<configuration>
...
<system.web>
    <compilation debug="true" targetFramework="4.5" />
    ...
</system.web>
</configuration>

这是Visual Studio默认为发布模式设置的内容。

Web.Release.config

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
 <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
 </system.web>
</configuration>
我正在使用这个工具来进行 MVC4 项目开发。根据这篇教程,我期望在发布模式下运行应用程序时,会提供js和css的压缩版本。但是实际上,非压缩版本的js和css被提供了。另一方面,如果我在web.config中显式地将debug设置为false,则会正确地提供压缩版本。

似乎是在发布模式下运行应用程序时出现了编译标记转换问题,但我不明白Web.Release.config中有什么问题。

总之,我无法通过在发布模式下运行应用程序来实现捆绑和最小化。


我敢打赌这是由于您的应用程序在 IIS 的父应用程序的虚拟目录下运行,并在缺少其配置时继承其配置,因此当存在时会修复它,覆盖父级配置! - Bon
6个回答

19

Web.config变形只在Web.Release.config中定义时,针对相应的配置部署/发布项目时才会执行。

仅仅更改Visual Studio中的活动配置为Release并运行应用程序是不会运行变形的。因此,web.config保持不变。顺便说一下,这种行为是合理的,因为Web应用程序是从包含原始web.config的项目目录中运行的。如果Visual Studio要转换web.config,您的原始web.config将被更改。

如果您还没有创建部署配置文件,请选择发布到文件系统以验证该行为。选择Release作为要运行部署的配置,变形应该会如预期执行。


1
我已经思考了一段时间了。顺便问一下,Visual Studio本地主机从哪个目录临时运行站点。我的意思是从哪个目录。比如说,当我使用Visual Studio调试网站时,我想检查web.config中最终的结果。 - Jatin
@Nirvan:据我所知,从VS运行应用程序时,使用的是开发文件夹。这就是为什么VS无法转换web.config,因为它会改变转换的起始点。 - Markus
@Nirvan:还有一件事:如果您在Web.Debug.config文件中也有调试转换,那么只有在部署时才会应用这些转换。这可能会导致不同的debug-web.configs。 - Markus
还可以查看来自AppHarbor的这个工具:https://webconfigtransformationtester.apphb.com/ - nmit026
@nmit026 感谢你的提示。看起来很不错,当创建转换时肯定会有所帮助。 - Markus

17

我的回答可能晚了,但这是对我有用的方法:

我更改了这一行:

<compilation xdt:Transform="RemoveAttributes(debug)" />

收件人:

<compilation xdt:Transform="Replace" debug="false" targetFramework="4.5" />

我认为这基本上解决了问题,因为优化器需要检查 Debug 值是否存在并且等于“false”。

希望这对那些不想从代码中管理此设置的人有所帮助。


6
请注意,替换操作将删除整个元素。当我使用这个操作后,我的包含程序集列表被删除了,我开始收到以下错误消息:类型“System.Object”在一个未被引用的程序集中定义。您必须添加对程序集“System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”的引用。 - leemicw

15
如果您想测试在Global.asax文件中设置的.NET捆绑和缩小文件,您还可以使用预编译符号。例如:
#if DEBUG
  BundleTable.EnableOptimizations = false;
#else
  BundleTable.EnableOptimizations = true;
#endif

有了这个,你的应用程序就不需要在构建操作中触发转换,可以按照你想要的方式运行。


12
可能对Omar.Alani的回答进行改进:
在“发布”转换中,替换以下行:
<compilation xdt:Transform="RemoveAttributes(debug)" />

具体来说,包括以下内容:

<compilation debug="false" xdt:Transform="SetAttributes" />

2
compilation debug="false" xdt:Transform="SetAttributes"

当您在发布Azure部署时激活XML转换以使配置转换特定于目标环境时,会派上用场。

当您在Azure部署时检查XML转换时,将执行以下序列:

  • 将web.release.config应用于web.config
  • 将web.stageName.config应用于修改后的web.config。

但是,web.release.config已经应用于web.base.config,因此如果

compilation xdt:Transform="RemoveAttributes(debug)" 

web.release.config文件中使用,web.config已经在编译时删除了debug属性,并且在部署时再次进行转换,尝试应用上述命令但失败了。


0
删除调试属性就足够了RemoveAttributes(debug)。 它的作用类似于debug = false。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接