Today, I got an exact same challenge Scot Hanselman faced 8 years ago.
Copied his script into my build file, error said: Regex does not exist.
Added system.dll reference in NAnt according to this post, no help.
I stopped, why bother using Regex for such a small task.
I turn back to native NAnt tasks. Strategy is,
- Find the hardcoded version number in vdproj file, e.g., 1.1.0, notify team member don’t touch it, this will be my constant, or token to be replaced later.
- Replace this 1.1.0 on the fly during the build, build msi. Create backup vdproj file before replacing.
- When build finished, restore original vdproj.
Simple and clean solution, job accomplished.
Only goofy part is, if I run this build script when Visual Studio opened, VS kept saving memory cached content to disk, causing file conflict.
Not a big deal, this build target only runs on our CI server anyway.
<property name="orig.version.number.in.vdproj" value="1.1.0" /> <!--ensure this matches vdproj-->
<property name="path.vdproj.file" value="src\EmailProcessorNTServiceSetup\EmailProcessorNTServiceSetup.vdproj" />
<property name="path.vdproj.file.orig" value="${path.vdproj.file}.orig" />
<target name="update.vdproj.version" depends="">
<loadfile file="${path.vdproj.file}" property="file.contents" />
<!-- build.number in format of xx.xx.xx.xx, need to shorten to xx.xx.xx to satisfy vdproj -->
<property name="version.number" value="${string::substring(build.number, 0, string::last-index-of(build.number, '.'))}"/>
<echo message="shorteded version.number: ${version.number}" />
<echo file="${path.vdproj.file}" message="${string::replace(file.contents, orig.version.number.in.vdproj, version.number)}" />
</target>
</target>
<target name="restore.vdproj.file" depends="">
<delete file="${path.vdproj.file}" />
<echo message="${path.vdproj.file} could not be deleted" if="${file::exists(path.vdproj.file)}" />
<if test="${not file::exists(path.vdproj.file)}">
<copy file="${path.vdproj.file.orig}"
tofile="${path.vdproj.file}"
/>
<delete file="${path.vdproj.file.orig}" />
</if>
<!-- can also replace it back, same result, but this potentially still mess up svn flag. <echo file="${path.vdproj.file}" message="${string::replace(file.contents, version.number, orig.version.number.in.vdproj)}" />-->
</target>