0

I want to replace the ProductVersion value at <DefineConstants> node of the following xml. Remaining part of the line has to be preserved. Example:

<DefineConstants>XXXXX;ProductVersion=20.323.23;YYYYY</DefineConstants>

to

<DefineConstants>XXXXX;ProductVersion=21.58.44;YYYYY</DefineConstants>

I tried the replaceregexp but it changes the remaining contents.

<replaceregexp file="${basedir}\Installer.wixproj"
     match="ProductVersion=([0-9].*);(.*)"
     replace="ProductVersion=${SpaceVersion};\1"
     byline="true"
/>

Could you guide me what i am doing wrong in this.

XML:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <PropertyGroup>
      <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
      <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
      <ProductVersion>3.5</ProductVersion>
      <ProjectGuid>{6bc0a85b-9c15-41e6-874b-5fe07e5338e6}</ProjectGuid>
      <SchemaVersion>2.0</SchemaVersion>
      <OutputName>Installer</OutputName>
      <OutputType>Package</OutputType>
      <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' AND '$(MSBuildExtensionsPath32)' != '' ">$(MSBuildExtensionsPath32)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
      <WixTargetsPath Condition=" '$(WixTargetsPath)' == '' ">$(MSBuildExtensionsPath)\Microsoft\WiX\v3.x\Wix.targets</WixTargetsPath>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
      <OutputPath>bin\$(Configuration)\</OutputPath>
      <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
      <DefineConstants>Debug;</DefineConstants>
      <WixVariables>
      </WixVariables>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
      <OutputPath>bin\$(Configuration)\</OutputPath>
      <IntermediateOutputPath>obj\$(Configuration)\</IntermediateOutputPath>
      <DefineConstants>SourceDir=$(SolutionDir)XSSE\;ProductVersion=3.3.1.75;ProductName=XSSE;ToolchinShortcut=XSSEToolchinShortcut;ExtensionDir=XSSE;ManifestFileName=extension.vsixmanifest;PkageDefFileName=XSSE.ToolchainProvider.pkgdef;REGKEY=Software\Microsoft\XSSE;</DefineConstants>
      <WixVariables>XYZ=123;</WixVariables>
   </PropertyGroup>
   <ItemGroup>
      <Compile Include="filefragment.wxs" />
      <Compile Include="Product.wxs" />
   </ItemGroup>
   <ItemGroup>
      <WixExtension Include="WixUIExtension">
         <HintPath>$(WixExtDir)\WixUIExtension.dll</HintPath>
         <Name>WixUIExtension</Name>
      </WixExtension>
   </ItemGroup>
   <Import Project="$(WixTargetsPath)" /> 

2 Answers 2

1

I think trying to capture the remainder of the line after the product version is unnecessary.

You don't need to worry about that. If your regex leaves the rest of the text alone, you can just replace the ProductVersion only.

I had success with this:

<replaceregexp file="${basedir}\Installer.wixproj"
    match="ProductVersion=[0-9]+\.?[0-9]+\.?[0-9]+\.?[0-9]+\.?;"
    replace="ProductVersion=${SpaceVersion};"
    byline="true"
    />
Sign up to request clarification or add additional context in comments.

Comments

0

You need to use \2 instead of \1.

<replaceregexp file="${basedir}\Installer.wixproj"
       match="ProductVersion=([0-9].*);(.*)"
       replace="ProductVersion=${SpaceVersion};\2"
       byline="true"
        />

Standalone test:

<project default="test">

    <property name="SpaceVersion" value="a.b.c"/>

    <target name="test">
      <replaceregexp file="test.xml"
         match="ProductVersion=([0-9].*);(.*)"
         replace="ProductVersion=${SpaceVersion};\2"
         byline="true"
       />
    </target>
</project>

Comparison of changed file with original:

$diff test.xml test.xml.0
2c2
<     <DefineConstants>XXXXX;ProductVersion=a.b.c;YYYYY</DefineConstants>
---
>     <DefineConstants>XXXXX;ProductVersion=20.323.23;YYYYY</DefineConstants>

2 Comments

It removes the YYYY part of that line. Expected Output: <DefineConstants>XXXXX;ProductVersion=21.58.44;YYYYY</DefineConstants> Actual Output: <DefineConstants>XXXXX;ProductVersion=21.58.44;</DefineConstants>
No it doesn't. Not after you change \1 to \2.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.