Bill of Materials (BOM) とは?
プロジェクトで利用するライブラリーのバージョンを指定して同期させるMavenの仕組み
つまり?
BOMを使うと、最適な依存ライブラリのバージョンを自動指定してくれる!
なにがお得?
- バージョンを個別に指定する記載が不要になり、build.gradleがスッキリする
- ライブラリの特定バージョンの組み合わせによる不具合がなくなる
※ ちなみに、Bill of Materials を直訳すると「部品表」という意味
MavenのBOMドキュメント
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#bill-of-materials-bom-poms
BOM List
Android開発で使えそうなBOMを集めてみた
Android
Firebase-BOM
https://mvnrepository.com/artifact/com.google.firebase/firebase-bom
Kotlin Libraries Bill of Materials
https://mvnrepository.com/artifact/org.jetbrains.kotlin/kotlin-bom
Kotlinx Coroutines BOM
https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-bom
Squareup.okhttp3
https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp-bom
オマケ
Spring Framework BOM
https://mvnrepository.com/artifact/org.springframework/spring-framework-bom
AWS SDK For Java
https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-pom
JUnit 5
https://mvnrepository.com/artifact/org.junit/junit-bom
依存関係を実際に確認してみよう
空のAndroidプロジェクトを作成
BOMライブラリをdependenciesに追加
dependencies tree を眺めて差分を確認してみる
./gradlew app:dependencies --configuration debugCompileClasspath | grep coroutine
今回は coroutin を使用する
https://mvnrepository.com/artifact/org.jetbrains.kotlinx/kotlinx-coroutines-bom
dependencies {
// Before : 個々にバージョン管理する必要がある
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.4.2'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test:1.4.2'
// After : BOM化するとバージョン指定は1つだけ
implementation platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.4.2")
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-test'
使用コード
https://github.com/ikemura23/Android-BOM-Sample/blob/main/app/build.gradle#L44-L48
BOMを有効活用しよう
BOMについてある程度理解はできた
さっそく、プロジェクトに導入いきましょう!
ここから妄想
社内専用のBOMを作ってみてはどうだろう?
例えば新規Androidプロジェクトを作る時に
「okhttpとretrofitとcoroutineを追加して〜」
これが「このBOM1つで解決やで!」
と、ならないだろうか
メリット
- ライブラリ選定が楽(同じライブラリしか使わない場合)
- プロジェクトの初期構築がスピードアップする
デメリット
- 社内にBOM環境を作る必要がある(GitHubのみでOK?)
- BOMバージョンのメンテナンスが大変そう
うーん、ちょっと考えてみたけど、長く使うとなればメンテのコストが大きい。
毎週のように新規プロジェクトが作成される状況や、自社でライブラリを作成/配布している場合には有効かも!