質問
Gradleでは、カスタムの依存関係構成が与えられた場合、Androidで実際に使用/コンパイルする最も簡単な方法は何ですか? または、「ローカル」と「外部」の依存関係を切り替える最良の方法は何ですか?
問題
ビルドを容易にし、マルチプロジェクト ビルドをより有効に活用するために、他のユーザーが使用する場合と使用しない場合があるトップレベルの「アグリゲーター」プロジェクトを作成しました。したがって、サブプロジェクトへの変更は、アグリゲーターで自己完結型でなければなりません。
このアグリゲーターのビルド プロセスでは、リポジトリ内のコンパイル済みアーティファクトではなく、サブプロジェクトのローカル バージョン (つまり、編集中のソース コード) を常に使用したいと考えています。さらに、このアグリゲーターは継続的インテグレーション環境で使用され、すべてのサブプロジェクトの単体テストがコードのコミットごとに実行されます。
詳細:部分解法
次のようなフラットなフォルダー構造を考えると、すべてのプロジェクト/モジュールが分離されているため、子は親について何も知りません。
+ Parent Aggregator Project
|---- build.gradle
|---- settings.gradle
| + app
| |---- build.gradle
| + models
| |---- build.gradle
| + networking
| |---- build.gradle
| + utils
| |---- build.gradle
最上位のプロジェクトに次の build.gradle ファイルを作成しました。
allprojects {
configurations {
localProjects {
extendsFrom compile
}
}
}
project(':app') {
dependencies {
localProjects project(':models')
localProjects project(':networking')
}
}
project(':networking') {
dependencies {
localProjects project(':utils')
}
}
構成はlocalProjects
適切に機能しており、それぞれが既存の依存関係 (「com.mycompany:utils:1.0.0」や「com.mycompany:models:1.0.0」など) をローカル プロジェクトに正常に置き換えています。唯一の問題は、Android で「コンパイル」ではなく「localProjects」依存関係セットを使用する方法がわからないことです。
純粋な Java の例では、sourceSet のクラスパスを手動で置き換える人を見てきましたが、これは Android プラグインでは簡単に機能しません。
概要
compile
, ,debugCompile
の代わりにこれらの依存関係でビルドするように、Android ビルドをカスタム依存関係構成にどのようにポイントしますreleaseCompile
か?
最終的には、インクリメンタル ビルドを機能させたいだけです。たとえば、「モデル」ソース コードを編集すると、次のようになります。
- 次回アプリをビルドすると、「モデル」プロジェクトが再コンパイルされます
- 'networking' または 'utils' コードを再コンパイルしません。
- これらの変更は、一度ビルドするとすぐにアプリに表示されます (つまり、「最新」の APK を生成するためだけに 3 つまたは 4 つの場所でビルドする必要はありません)。
- これらのプロジェクトのいずれかにコードを変更するときは、アグリゲーター プロジェクトからビルドを実行するだけで、適切なものがコンパイルされ、生成された APK にマシンの最新コードが反映されます。
- 同様に、アグリゲーターからすべての単体テストを実行できます
- 最後になりましたが、これを達成するために既存のプロジェクトを編集することはできません。プロジェクトにはアグリゲーターを使用することを選択しない他のエンジニアがいる可能性があるため、すべての変更はアグリゲーターで自己完結型でなければなりません。
これは非常に一般的な使用例であり、Gradle チームは、この種のことに対するより良いサポートを将来追加すると述べています。それまでの間、これをどのように解決しますか?