💨

BoMを使いながら個別にライブラリのバージョンを指定する

2021/06/12に公開

背景

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