Background and Motivation
While developing another project for
Black Knight Technology, we had a need to create an update package with each new release of the project. Each project binary was held in it's own source and bin directories, a standard practice. At first we used a simple batch file to grab a copy of the required files and create a release package. As the project evolved and more files were added, it became harder and harder to maintain the batch file. This was compounded by the fact that we were performing continuous integration on a build server with a different root file structure and required packages to be created with each nightly build. Relative paths were not an option because files needed to be copied across hard drive partitions (from D: to F:) for company web access. Similar problems arose when investigating build tasks for copying files using NAnt and MSBuild.
Overview
Rather than maintaining two or even three versions of batch files for copying the same files (where we would inevitably make a mistake) we opted to create a tool that would allow us to specify what we could control, namely the source file structures maintained by CVS, and substitute the parts of the path that might vary, such as the root for the source and destination. The result is SmoothCopy.
SmoothCopy is a command line tool (though a GUI may be developed for it) that takes an XML configuration file, known as a Grab Pack, and several command line arguments. The Grab Pack specifies relative (or absolute) path locations and files to be copied. Grab Packs can be organized so that it is possible to grab some or all files by grouping files together in a sub-pack. For example, our project has sub-packs defined for documentation, plug-ins, and the main tool. This feature is similar to targets in Make (make all, make clean, make superlib, etc..).
By changing command line options when SmoothCopy is run, the user can change the path of the source file to be copied as well as the path to where the file will be copied. In this way, we are able to use a single configuration file for creating release packages on both developer machines and the integration server. Because SmoothCopy is command line based, it was trivial to roll into our integration server as a build task while at the same time using it on our development machines.
Other features include robust Grab Pack error checking and dynamic directory creation.