言葉
この記事で使用する言葉を以下の通り定義します
言葉 | 意味 |
---|---|
プロジェクト | Android Studioでいうプロジェクト. gradle.settings があるところ.(だいたいの場合において) |
モジュール | Android Studioでいうモジュール.プロジェクト以下のアプリケーションとかライブラリのこと |
はじめに
モジュールが増えて少し大きなプロジェクトになると,例えばプロジェクトAのライブラリを用いてプロジェクトBを立てることもあると思います.
私の所属するチームの場合,プロジェクトAで作成したアプリケーションのサブツール(バッチやらデバッグ用ツールなど)をプロジェクトBで管理しています.
Gitリポジトリはプロジェクト毎に切っていて,A, BそれぞれGitリポジトリとなっています.
依存問題
プロジェクトBはプロジェクトAに依存しているので,プロジェクトBにプロジェクトAをサブモジュールとして登録します
仮にこんなディレクトリ構造になったとしましょう
└─ProjectB
├─Module1
└─ProjectA // (git submodule)
├─Library1
├─Library2
└─Module1
[ProjectB-Module1] が, [ProjectA-Library2]に依存していると仮定します.
この状態で素直に gradle.settings
を書くと
include ':Module1'
include ':ProjectA:Library2'
となります.
この依存関係であれば上手くいくのですが,以下の条件でビルドが通らなくなります
- [ProjectA-Library2] は [ProjectA-Library1] に依存する
上の条件が足されると,
include ':Module1'
include ':ProjectA:Library1'
include ':ProjectA:Library2'
では通りません.
:ProjectA:Library2
の build.gradle
の dependencies
ブロックに :Library1
としか書いていないため, [ProjectA-Library2] が依存する [ProjectA-Library1] を解決できないためです.
プロジェクトの場所を指定してあげる
前置きが長くなりましたが,要はプロジェクトBとプロジェクトAは同じ階層にあるように見せてあげれば良いです.
それは プロジェクトB の gradle.settings
に記載します.
include ':Module1'
include ':Library1'
include ':Library2'
project(':Library1').projectDir = new File('ProjectA/Library1');
project(':Library2').projectDir = new File('ProjectA/Library2');
こうすることで,プロジェクトAに余計な変更を強いず,プロジェクトBは git submodule のプロジェクトAに素直に依存しながら,依存解決もできるようになります.