Usage of SVN Externals
How do people typically create dependencies using Subversion?
Here are some guidelines:
- Avoid copying common code; for example, you don’t want JBoss in every java project
- Be able to easily reference a “pegged” revision of the code. For example, your project may specifically require version 3_2_6 of JBoss
- Be able to track the “bleeding edge” of some dependencies, for example, you may want to always stay current on the spring framework you use
A common strategy for dealing with this situation in Subversion is something called the “externals”. The externals in Subversion could be a link to another subversion repository.
Since all Subversion repositories are identified by URL, it is easy to construct a reference to an external source.
Externals make use of another feature of Subversion, the property.
Properties are simply name/value pairs. An example might make this clearer.
Suppose your development project has the following structure:
/branches
/tags
/trunk/j2eeapplication
/trunk/thirdparty
And our development project component uses JBoss. We are required to use the latest version of gddwebapps but gddwebapps has specific dependencies on JBoss 3_2_6
And further suppose our development group has setup a repository containing versions of gddwebapps component at this URL:
https://myproject.collab.net/svn/repos/gddwebapps
And the JBoss 3_2_6 is located in another SVN repository
https://myproject.collab.net/svn/repos/jbossserver
Using the setup below, one would set the built-in subversion property, svn:externals on the /trunk/thirdparty directory.
https://myproject.collab.net/svn/repos/gddwebapps/trunk/thirdparty
This property would have this value:
JBoss3_2_6 https://myproject.collab.net/svn/repos/jbossserver
So how would you set this up?
Here is a “How To” example:
Step 1:
cd to …gddwebapptrunkthirdparty directory
Step 2:
svn propset svn:externals “JBoss 3_2_6
https://myproject.collab.net/svn/repos/jbossserver/JBoss_3_2_6” .
Step 3: svn commit
Step 4: svn update
(This will fetch external item into ‘JBoss 3_2_6’)
JBoss_3_2_6 now appears in the ../gddwebapp/trunk folder (workspace) as illustrated in Figure A.
Figure A
Upon branching i.e. creating a nick_devel branch, external JBoss_3_2_6 appears in the nick_devel workspace as illustrated below in Figures B and C.
Figure B
Figure C