Subversionでリポジトリの外部参照を活かす

大規模な開発になると、モジュールを分割して開発することになりますが、各モジュールで参照するライブラリ(Javaの場合はjar)は、共通の一ヶ所で管理したくなることがあります。
構成管理リポジトリでは、リポジトリからファイルを取得したらそのまま開発に入れるディレクトリ構成にしておくことが望ましいですが、複数モジュールが存在する中でそのような管理をしようとすると、ライブラリを多重管理することになってしまいます。


そこで、シンボリックのような参照ができると、ライブラリの管理が一元管理できて簡単です。
Subversionには、「外部参照」といって、リポジトリシンボリックリンクのようなことを実現する方法があります。


以下にその設定手順を示します。

リポジトリの構成

SampleProject
 ├─branches
 ├─tags
 └─trunk
    ├─lib
    ├─module-a
    └─module-b

リンク先のディレクトリ構成

  • 外部参照前
module-a
 ├─src
 ├─lib
 └─target
  • 外部参照後
module-a
 ├─src
 ├─lib
 ├─lib-global <--- このディレクトリがtrunk/libを参照するようにしたい
 └─target


上記のようにするには、module-aディレクトリに対して、Subversionの「svn:externals」属性で、以下の値を設定する(svn propsetやsvn propedit コマンドなどで設定/編集可能)。

lib-global http://localhost/svn/SampleProject/lib
  • 注意点
    • 同一リポジトリ内であっても、http(https)からURLを指定する(SVN1.4以下では相対パスは不可)。当然、外部のリポジトリも設定可能。
    • 属性を設定する際に、lib-globalディレクトリは作成しておかないこと。


上記の属性を設定した後、update(更新)を行うと、「trunk/lib」内のファイルが「trunk/module-a/lib-global」配下に取得されます。
サーバ上でのリポジトリブラウザではlib-globalは存在しませんが、属性をサーバにコミットしておけば、他の人が取得した際も、同様の構成にてファイルが取得されるようになります。


少し手間ではありますが、設定さえしてしまえば、ファイルの多重管理を防ぐことが可能になります。