Question

I have this web.config file with the compilation option set as below

Web.config

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

And here is what Visual Studio puts for release mode by default.

Web.Release.config

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
 <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
 </system.web>
</configuration>

I am using this for MVC4 project. Based on this tutorial, I was expecting that minified versions of js and css would be served, when the application is run under Release Mode. But this doesn't seem to be working and non-minified versions of js and css are being served. On the other hand, if I explicitly set debug to false in web.config, then the min versions are served correctly.

It seems like compilation tag Transform issue when the application is run under Release Mode, but I don't understand what's wrong with the same in Web.Release.config.

In short, I am unable to get bundling and minification working, by running application under Release Mode.

Was it helpful?

Solution

Web.config transformations as they are defined in the Web.Release.config are only done when deploying/publishing the project for the relevant configuration.

Just changing the active configuration in Visual Studio to Release and running the application does not run the transformations. Therefore, the web.config remains unchanged. This behavior is reasonable by the way as a web application is run from the project directory that contains the original web.config. If Visual Studio were to transform the web.consign, your original web.config would be changed.

If you haven't created a deployment profile yet, you can publish your application to the file system to verify the behavior. Choose Release as the configuration to run the deployment for. The transformations should be executed as expected.

OTHER TIPS

My answer might be late, however this what worked with me:

I've changed the line :

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

to :

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

this basically did the trick, as I think the optimizer is looking for Debug value to be be present and == "false".

Hope this helps people who don't want to manage this from code.

If you'd like to test your .NET bundling and minification that you've got set up in your Global.asax file, you can also use precompilation notation...for example

#if DEBUG
  BundleTable.EnableOptimizations = false;
#else
  BundleTable.EnableOptimizations = true;
#endif

With this, your application won't need to trigger the transform in the build operation and will run just like you want it to.

Possibly an improvement to Omar.Alani's answer:

In the Release transform, replace the line:

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

with the following:

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

comes in handy when you are activating XML transformations at release azure deployment time to make configuration transformations specific to a target environment.

When you check XML transform at azure deployment time, the following sequence is done:

  • Apply web.release.config on web.config
  • Apply web.stageName.config on modified web.config.

But web.release.config has already been applied on web.base.config so if

compilation xdt:Transform="RemoveAttributes(debug)" 

is used in web.release.config file, the web.config has already debug attribute been removed at compilation time and when it deploys it transform again with web.release.config, trying to apply the above command but it fails.

Removing debug attribute is sufficient RemoveAttributes(debug). It will work similar to debug=false.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top