Trimming The Trunk In Subversion
I have a number of third party libraries that I use in my applications. I also have a number of utility type assemblies that I have created and re-use in many applications. In this post, I will show you how I use the subversion ‘externals’ feature to keep my application trunks lean and clean.
The Problem
Including re-usable assemblies in your application’s repository can lead to bloating. I typically pack away not only the compiled DLLs, but also the zipped up version of the code. In addition, I may have applications that depend on different versions of the library. This quickly makes my third party library very sizeable and too heavy to include in every project. Here is a screen shot of part of my third party library as it exists on my hard drive.
Notice that each library has a version folder (or many version folders) as the first child. Inside the version folder is a folder of binaries (DLLs) and a zipped up file containing code for this version. All of these files / folders are checked into source control into a third party repository.
I don’t want to include these files in every application’s repository. What I would like to include is just the content of the binaries folders and only for the third party libraries that I am using in the project.
The Solution
Here is a screen shot of the folders / files for a website that I am building. Notice, there is an ‘Externals’ folder. This is where I want all the external library DLLs to appear.
As you can see, in the above example, I am using three third party libraries: cutting edge conditions, mysql connector, and an XML provider. I could add the DLLs to these folders and manually manage the ‘Externals’ folder. However, subversion has a nice feature that allows you to connect multiple repositories. In the example below I am using TortoiseSVN.
To setup this feature right-click the ‘Externals’ folder and select the TortoiseSVN – Properties menu item.
Click the “New…” button. For the “Property name:” element select the “svn:externals” option.
In my case I entered the following property values:
https://svn.trunksapp.com/rcravens/3rd_party_libs/CuttingEdge.Conditions/version_1_0/Binaries CuttingEdge https://svn.trunksapp.com/rcravens/3rd_party_libs/MySql/version_6_2_2/Binaries MySql https://svn.trunksapp.com/rcravens/3rd_party_libs/XmlProviderLibrary/version_1_0_0_5/Binaries XmlProvider
These properties have the following format: <a folder in subersion> <local folder name>
Once you define these, the application’s repository will not contain the bytes associated with these libraries.
In essence you have configured a pointer to the files. However, when you load a local copy of your repository, the files are pulled in from the external repos.
Summary
Using this configuration, you can save a bit of space in your subversion repository. In addition it makes moving to the next version as simple as adjusting the link in the externals configuration.
Great tip!