When we released VS2010 we add support for
web.config (XDT) transforms during publish/package.
Note: From now on I’ll only use the word publish from now on but the full content relates to packaging as well.
In the original implementation when you published your web project the
web.config file would be transformed by the file
web.{Configuration}.config, where {Configuration} is the project build
configuration. For example Debug, or Release. If you publish on Release
and there exists a web.release.config we will take your web.config and
transform it with web.release.config before publishing.
Cascading web.config transformations
In VS 2012 (
as well as the publishing updates for VS2010 through the Azure SDK)
now support the concept of publish specific transforms. You can also
now specify the project configuration used for a profile when publishing
on the publish dialog.
In
this case I have created a profile named Production and set the
Configuration to Release. When I publish this project the following
transformations will be applied (if the files exist) in this order.
- web.release.config
- web.production.config
I
think that we got this wrong when we initially implemented the support.
We should have created profile specific transforms instead of ones
based on build config, but having these cascading transforms are still
pretty useful. For example I may want to remove the attribute
debug=”true” from the compilation element and then inside of the profile
specific transform we would override appSettings/WCF endpoints/logging
config/etc for that environment.
In VS there is a right-click
option on web.config for Add Config Transform, but we were not able to
update the functionality of that to automatically create profile
specific transforms. Don’t worry, it will be released soon with one of
our updates for web tooling. For now you will need to create a new file
with the correct name and add it to your project.
Note: if you want
it to show up nested under web.config you’ll need to add the metadata
Web.config to the item in the
.csproj/.vbproj file.
web.config transform preview
Previously
the only way to test the functionality for these transformation was to
actually publish or package the web project. This gets old pretty quick.
In order to simplify creating these transforms we have introduced the
Preview Transform menu option. This is the
coolest feature in VS 2012 (
OK I’m a bit biased, but still its the coolest).
In
my web.release.config I have left the default contents, which just
removes the debug attribute. Here is what I see when I select this on
web.release.config for my project.
You can see that in the image above we can see that the debug flag was indeed removed as expected.
In
my web.production.config I have a transform which simply updates the
email app setting value. Here is the really cool part when I preview the
transform for web.production.config the previewer will look into the
profile and determine the build configuration which has been configured,
and it will ensure that transform is applied before the profile
specific one. For example take a look at the result for
web.production.config.
In
the image above you can see the note that web.release.config was
applied first followed by web.production.config. In the result we can
see that web.release.config removed the debug flag and that
web.production.config updated the email address value.
We also
do a little bit to help out in case there are errors in either the
web.config or a transform. You can see errors in the Output Window and
double click it to go directly to where the error exists.
Note:
Scott Hanselman has a
5 minute video showing this and other updates.
Another note: If you need to transform any file besides web.config during publish then install my extension
SlowCheetah.
Cross posted to
http://sedodream.com/2012/08/19/ProfileSpecificWebconfigTransformsAndTransformPreview.aspx
Sayed Ibrahim Hashimi |
@SayedIHashimi