I recently released an updated version of my Generate Parameters.XML tool for Visual Studio. This release adds support for generating parameters.xml files from app.config files as well as web.config files Why you might ask why add support for app.config files when the parameters.xml model is only part of WebDeploy? Well, at Black Marble we like the model of updating a single file using a tokenised set of parameters from within our DevOps CI/CD pipelines. It makes it easy to take release variables and write them, at deploy time, into a parameters.xml file to be injected into a machine’s configuration. We wanted to extend this to configuring services and the like where for example a DLL based service is configured with a mycode.dll.config file The injection process of the parameters.xml into a web.config file is automatically done as part of the WebDeploy process (or a VSTS extension wrapping WebDeploy), but if you want to use a similar model for app.config files then you need some PowerShell. For example, if we have the app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<applicationSettings>
<Service.Properties.Settings>
<setting name="Directory1" serializeAs="String">
<value>C:ABC1111</value>
</setting>
<setting name="Directory2" serializeAs="String">
<value>C:abc2222</value>
</setting>
</Service.Properties.Settings>
</applicationSettings>
<appSettings>
<add key="AppSetting1" value="123" />
<add key="AppSetting2" value="456" />
</appSettings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6" />
</startup>
</configuration>
My extension generates a tokenised parameters.xml file
<parameters>
<parameter name="AppSetting1" description="Description for AppSetting1" defaultvalue="\_\_APPSETTING1\_\_" tags="">
<parameterentry kind="XmlFile" scope="\\App.config$" match="/configuration/appSettings/add\[@key='AppSetting1'\]/@value" />
</parameter>
<parameter name="AppSetting2" description="Description for AppSetting2" defaultvalue="\_\_APPSETTING2\_\_" tags="">
<parameterentry kind="XmlFile" scope="\\App.config$" match="/configuration/appSettings/add\[@key='AppSetting2'\]/@value" />
</parameter>
<parameter name="Directory1" description="Description for Directory1" defaultvalue="\_\_DIRECTORY1\_\_" tags="">
<parameterentry kind="XmlFile" scope="\\App.config$" match="/configuration/applicationSettings/Service.Properties.Settings/setting\[@name='Directory1'\]/value/text()" />
</parameter>
<parameter name="Directory2" description="Description for Directory2" defaultvalue="\_\_DIRECTORY2\_\_" tags="">
<parameterentry kind="XmlFile" scope="\\App.config$" match="/configuration/applicationSettings/Service.Properties.Settings/setting\[@name='Directory2'\]/value/text()" />
</parameter>
</parameters>
The values in this parameters.xml file can be updated using a CI/CD replace tokens task, we use Colin’s ALM Corner Build & Release Tools, Replace Tokens, in exactly the same way as we would for a web.config Finally the following PowerShell can be used to update the app.config from this parameters.xml
Thus giving a consistent way of updating configuration files for both web.config and app.config files