We help IT Professionals succeed at work.

Check out our new AWS podcast with Certified Expert, Phil Phillips! Listen to "How to Execute a Seamless AWS Migration" on EE or on your favorite podcast platform. Listen Now

x

Problems using MSBuild XMLUpdate and UpdateFiles

Skidmerc
Skidmerc asked
on
Medium Priority
4,388 Views
Last Modified: 2013-12-12
Hi,
We have a large application and are trying to automate the build process between different environments.
I have an MSBuild script working quite well for the majority.
I have successfully got FileUpdate working in the "UpdateConnections" target (see below), and this loops through the .config files and .cs files etc replacing any instance it comes across.
It also does the connectionstrings in web.config which is great.

I'm now looking to tackle the web.config for other things.
We have a number of appSettings we need to change, and also have an identity we impersonate in system.web.

See below for an example of this web.config.

As you can see, we would like to update appVersion, and SCIUploadPath.
I have tried:

<XmlUpdate      
                  Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0"            
                  XmlFileName="$(BuildDirectory)\web.config"
                  Xpath="/configuration/appSettings/add[@key='appVersion']/@value"
                  Value="154"
              />

But this didn't bring any luck.
In the log I just got:

<message level="normal"><![CDATA[Updating Xml Document "E:\Builds\build\PreProduction\Apps\web.config".]]></message>
      <message level="normal"><![CDATA[  0 node(s) selected for update.]]></message>
      <message level="normal"><![CDATA[XmlUpdate Wrote: "154".]]></message>

This implies it found the file etc no problem (correct path), but had a problem finding the node?

I've found exmaples online, but the Community Tasks stuff seems to be pretty porrly documented.



Also having a poor time using FileUpdate when trying to change the identity line.

             <FileUpdate Files="$(BuildDirectory)\web.config"
                          Regex="domain\user"
                          ReplacementText ="NEWDOMAIN\NEWUSER" />

Log shows:
      <message level="normal"><![CDATA[Updating File "E:\Builds\build\PreProduction\Apps\web.config".]]></message>
      <message level="normal"><![CDATA[  Replaced matches with "NEWDOMAIN\NEWUSER".]]></message>

But nothing has changed in the file.

Can anyone assist?
Code from MSBuild file: 
<Target Name="UpdateConnections" DependsOnTargets ="GetConnectionFiles">
  <Attrib Files="@(ConnectionFiles)" ReadOnly="false"/>
  <FileUpdate Files="@(ConnectionFiles)" 
      Regex="DEVELOPMENT_SERVER_DNS" 
      ReplacementText ="$(NewServer)" />
</Target>
 
 
Our web.config file: 
<?xml version="1.0" encoding="utf-8"?>
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
  <configSections>
    <!--blah blah -->
  </configSections>
  <connectionStrings>
    <!--blah blah -->
  </connectionStrings>
    <compilation debug="true">
      <assemblies>
        <!--blah blah -->
      </assemblies>
    </compilation>
    <pages autoEventWireup="false" buffer="true" enableSessionState="true" viewStateEncryptionMode="Auto" enableViewStateMac="true">
      <controls>
        <!--blah blah -->
      </controls>
      <namespaces>
        <!--blah blah -->
      </namespaces>
    </pages>
    <identity impersonate="true" userName="domain\user" password="987654321" />
  </system.web>
  <location allowOverride="true" inheritInChildApplications="true">
    <appSettings>
      
      <add key="appVersion" value="v1.4.8" />
      <add key="SCIUploadPath" value="\\devserver\eprDocDump\" />
    </appSettings>
  </location>
</configuration>

Open in new window

Comment
Watch Question

Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Author

Commented:
Definitely updating the right file.
Well spotted, forgot about the location level.
However, still getting the 0 node(s) selected for read message
Using XMLRead just to output the value:

<XmlRead
            Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0"
                  XmlFileName="$(BuildDirectory)\web.config"
                  XPath="/configuration/location/appSettings/add[@key='appVersion']/@value">
                  <Output TaskParameter="Value" PropertyName="appVersion"/>
            </XmlRead>


Heard some people mention it's down to the xlmns at the top of web config and it may work without it?

Author

Commented:
I can confirm the following code works it I remove the xmlns attribute from the top line in web.config:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
leaving it as
<configuration>

<XmlRead
                  Namespace="http://schemas.microsoft.com/.NetConfiguration/v2.0"
                  XmlFileName="$(BuildDirectory)\web.config"
                  XPath="configuration/location/appSettings/add[@key='appVersion']/@value">
                  <Output TaskParameter="Value" PropertyName="appVersion"/>
            </XmlRead>

However, i don't want to have to change my web.config for the whole solution, just to be able to do this.
There must be another way?
Unlock this solution and get a sample of our free trial.
(No credit card required)
UNLOCK SOLUTION

Author

Commented:
That's exactly what I'm looking at just now.

Might try put together a custom WebConfigUpdate task of some sort that will be bespoke to our own processes.

Author

Commented:
Sorted.

Bit of a back possibly - but it works.

<FileUpdate Files="$(BuildDirectory)\web.config"
                          Regex="xmlns%3D%22http://schemas.microsoft.com/.NetConfiguration/v2.0%22"
                          ReplacementText =" " />
      
      <!-- Update the app version -->
            <XmlUpdate      
                  XmlFileName="$(BuildDirectory)\web.config"
                  Xpath="/configuration/location/appSettings/add[@key='appVersion']/@value"
                  Value="v$(Major).$(Minor).$(Revision)"
              />


The first one remove the "xmlns" line from the configration.
This then lets the xpath work it's stuff for the rest of the XMLUpdates.

Author

Commented:
Helped give me pointers for future work i can do with the Community Tasks project source, and helped me narrow down what was going wrong with current way of working.
Unlock the solution to this question.
Thanks for using Experts Exchange.

Please provide your email to receive a sample view!

*This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

OR

Please enter a first name

Please enter a last name

8+ characters (letters, numbers, and a symbol)

By clicking, you agree to the Terms of Use and Privacy Policy.