BoMを使いながら個別にライブラリのバージョンを指定する
背景
Firebaseのいくつかのライブラリを使用しているが、バージョンアップが頻繁にあるため更新業のコストを下げるためにFirebase BoMを使いたい。
課題
基本的にはBoMで自動で指定されているバージョンを使うが、一部ライブラリでのみバグがあった時対応できるよう、そのライブラリだけバージョンを指定できるようにしたい。
特にFirebaseについては同時に大量にバージョンアップがありながらも不具合が一部だけ起こる、というケースがある印象だった。
結論
strictly
strictlyで指定してやるとそのバージョンが優先して使われるようになる。
gradleのドキュメントを見ると、まさに懸念していたケースで使うものだとわかる。
https://docs.gradle.org/current/userguide/rich_versions.html
In general, forcing dependencies is done to downgrade a dependency. There might be different use cases for downgrading:
- a bug was discovered in the latest release
implementation platform('com.google.firebase:firebase-bom:28.1.0')
implementation('com.google.firebase:firebase-appindexing') {
version {
strictly '18.0.0'
}
}
調査内容
公式
BoMのドキュメントにはまさにこのケースの内容が書いてある。
BoM で指定されているものとは異なるライブラリ バージョンを使用するにはどうすればよいですか?
dependencies {
// Import the BoM for the Firebase platform
implementation platform('com.google.firebase:firebase-bom:28.1.0')
// Declare the dependency for the App Indexing library and specify a version
// This specified library version overrides the version designated in the BoM.
implementation 'com.google.firebase:firebase-appindexing:18.0.0'
}
BoMを使いながらもそのままライブラリのバージョンを指定する。
firebase-bom:28.1.0
では firebase-appindexing:20.0.0
が指定されているが、ドキュメントどおりやれば 18.0.0
を使うはず・・・なのだがそうならなかった。
なんでや。
./gradlew app:dependencies | grep appindexing
| \--- com.google.firebase:firebase-appindexing:20.0.0 (c)
\--- com.google.firebase:firebase-appindexing:18.0.0 -> 20.0.0
ちなみにbomで指定されているバージョンより低いバージョンをライブラリで指定している場合はbomでのバージョンになり、
高いバージョンを指定している場合はそのバージョンになった。
つまりbomでのバージョンと個別にしているバージョンとで通常通りバージョン番号解決が行われているっぽい。
excludeをつかう
excludeしてbomからapp-indexing使えばいけるのではないか?とやってみると、プロジェクトによってうまくいったりいかなかったりした。
implementation platform('com.google.firebase:firebase-bom:28.1.0') {
exclude group: 'com.google.firebase', module: 'firebase-appindexing'
}
implementation('com.google.firebase:firebase-appindexing:18.0.0')
./gradlew app:dependencies | grep appindexing
\--- com.google.firebase:firebase-appindexing:18.0.0
+--- com.google.firebase:firebase-appindexing:18.0.0
...
新しく作ってappindexingしかimportしていないプロジェクトだとビルドが通ったが、普段開発しているプロジェクト(依存関係たくさん)だとビルドがこけていた。
Discussion