はじめに
Gradleにはタスクの定義/実行や依存関係のコントール等、便利な機能が様々あると思います。
今回は、ライブラリのビルド依存関係を追加する場合のTipsを記載します。
BOMを利用する場合の注意点です。
GradleはGroovy DSLの他にKotlin DSLでも記述可能だと思いますが、本記事の例はGroovyで記載しています。
また、ライブラリは例で記述した存在しないものです。
ちょっとふりかえり
依存関係の定義
Gradleで依存関係を定義する際、以下の様にdependencesを利用します。
例では記載のバリエーションの為、統一感の無い記述を行っていますが、本来は実装を統一する方が視認もし易いと思います。
dependencies {
implementation 'com.hulft:sample-library-a:1.0.2'
//バージョンを省略したり
implementation 'com.hulft:sample-library-a'
//指定する要素毎に記述する事も可能
implementation group: 'com.hulft', name: 'sample-library-a', version: '1.1.0'
}
依存ライブラリについて、 グループ : 名前 : バージョン(記載し無い事も可能) という形で指定を行う事が可能です。
BOMの利用
Gradleでは特定バージョンから、BOM(bill-of-materials)が利用可能です。
個人的な印象としては、ライブラリ自身が利用するライブラリのバージョンを含めた一覧、というイメージです。
BOM自体の詳しい説明は、Gradle、Mavenの公式サイトに記載されています。
GradleではBOMを以下の様に指定可能です。
dependencies {
//BOMの指定
implementation platform('com.hulft:sample-library-dependencies:1.0.1.RELEASE')
}
例えば、BOMの定義上、以下の様な依存関係があった場合、
- sample-library-dependencies
- sample-library-a : 2.0.1
- sample-library-b : 1.2.1
- sample-library-c : 1.2.3
以下の様に定義する事で、個別に設定しているライブラリのバージョンを省略し、
BOM内に定義されているバージョンを利用出来ます。
dependencies {
implementation platform('com.hulft:sample-library-dependencies:1.0.1.DEV')
//バージョン指定を省略
//→ BOM内で定義されているバージョンのライブラリ(例では2.0.1)が利用される
implementation 'com.hulft:sample-library-a'
}
注意点
特にライブラリ自身が依存するライブラリが多く、依存関係が複数ある場合、都度個別にバージョン指定するのは煩雑な場合もあると思います。
その様なケースでBOMの利用は依存管理の負荷を軽減してくれる、便利な機能だと思っています。
しかし、注意点も有ると思います。
例として、複数先から同じライブラリに対して依存を行う場合等が挙げられます。
以下の様なケースでは、sample-library-aのバージョン1.5.0を指定したつもりでも、
実際にはBOM内の定義とライブラリが衝突する事があり得ます。
dependencies {
//BOM内では sample-library-a : 2.0.1 が定義されている
implementation platform('com.hulft:sample-library-dependencies:1.0.1.DEV')
//BOM内で依存されているライブラリを直接指定して、特定のバージョンを指定
//dependencies上はバージョン1.5.0が利用される様に見えてしまう
implementation 'com.hulft:sample-library-a:1.5.0'
}
この様に異なるバージョンの同じライブラリを指定した場合の挙動は設定によって調整可能です。
- 例
- ・Gradleが推移的依存関係から最も新しいバージョンを読込
- ・ModuleDependency.excludeからBOM上の依存バージョンを除外
- ・ResolutionStrategy.forceから依存バージョンを強制
BOMは様々なシーンで便利に利用出来ると思いますが、BOM自体の定義を確認しないと、内部で依存しているライブラリの詳細に意識が向きにくい面もあると思います。
思わぬバージョン競合が起こり、それがデフォルト設定で解決されている様な場合、想定外のバージョンが読み込まれている、というような事もあり得そうです。
個人的な対策
当たり前かも知れませんが、依存関係部分を変更する際には、実際にどの様な依存関係となっているのか、を確認すると、想定外の事象を減らす事が出来ると思います。
gradle dependencies