torutkのブログ

ソフトウェア・エンジニアのブログ

依存関係のある複数のNetBeansプロジェクトをGitで管理する(サブモジュール)

背景

小さなアプリケーションを複数作成し、それぞれGitリポジトリ上は別々に管理しています。例えば、次の4つのJavaFXアプリケーションを作成し、それぞれを独立したGitリポジトリに置いて管理しているものとします。

AnalogClockGadget
CalendarGadget
EarthGadget
ImageGadget

それぞれがまったく独立(疎)である間は、必要とするアプリケーションのリポジトリをクローンして開発作業をしています。クローンしたディレクトリをNetBeansで開けばすぐにビルド・実行ができます。

ここで、4つのアプリケーション間で共通の実装が増えてきたので、新たにNetBeansでライブラリプロジェクト GadgetSupport を作成し、各アプリケーションはこのGadgetSupportに依存するようにします。

すると、例えばImageGadgetだけをクローンしてビルドしようとしても依存するGadgetSupportプロジェクトが所定の場所にないためエラーとなってしまいます。

NetBeansのプロジェクト設定で、別なプロジェクトを依存関係に追加した場合、nbproject/project.properties ファイルに相対パスで依存するライブラリプロジェクトのパスが記述されます。

そのため、アプリケーションのクローンに加えて、依存するライブラリプロジェクトをプロジェクト設定に従った相対パスへクローンして配置する必要があります。なかなかに手間がかかります。

解決方法の模索

すべてを一つのリポジトリ(あまりよくない解決)

各アプリケーションプロジェクトとライブラリプロジェクトを一つのリポジトリにまとめてしまう方法があります。これならばクローン1回で済みます。ただし、直接依存関係のないアプリケーション同士も同じリポジトリに入り、また、以後どんどんアプリケーションが増えてくることで、履歴管理が煩雑になりかねません。

サブモジュール

Gitのサブモジュールを活用して、各アプリケーションのリポジトリの中に、依存するライブラリのリポジトリをサブモジュールとして追加します。これならばクローン1回でビルド・実行が可能です。

CalendarGadget のリポジトリにサブモジュールとしてGadgetSupport を追加

最近は、GitクライアントにAtlassianのSourceTreeを使っています。SourceTreeからは、[リポジトリ]メニュー > [サブモジュールを追加]を選択し、[元のパス/URL]欄に、GadgetSupportのリポジトリのURLを記載、ローカル相対パスはデフォルトでリポジトリ名が入るのでそのまま使います。

すると、CalendarGadgetリポジトリ上にGadgetSupportディレクトリが作られます。

CalendarGadget
  +-- nbproject
  +-- src
  +-- GadgetSupport

CalendarGadgetをNetBeansで開き、プロジェクトプロパティでライブラリの追加でGadgetSupportを選択して依存関係を付けます。以後は、CalendarGadgetをビルドするとGadgetSupportもビルドされるようになります。

Gitリポジトリとしては、CalenarGadgetをクローンするとGadgetSupportも含まれるので、従来同様ビルド・実行できています。

SourceTreeでCalendarGadgetリポジトリを開いたときに左側ペインのサブモジュールの下にGadgetSupportが追加されます。これをダブルクリックすると、GadgetSupportのリポジトリ内容が表示されます。言わばシンボリックリンクのような状況でしょうか。

SourceTreeメモ

Windows OS用のSourceTreeについて、気になる点

  • 起動時、アイコンクリックから画面表示まで時間がかかっているため、起動のためのアイコンダブルクリックが有効だったかどうか不安になる
  • 全体的にもったりした動き
  • 時々、キー入力が受け付けられなくなりちょっと待つとキータイプした文字が入力される現象あり