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>