推移的依存関係とは
ライブラリの中でさらにライブラリが使われてたりしますよね。
例えばAというライブラリの中でv1.0.0のBというライブラリが使われていたとします。
gradleを通してAのバージョンをアップデートして、Bはv1.0.0のままにしていたとしても、
アプデ後のAの中でもしv1.2.0のBが使われている場合、アプリではv1.2.0のBが使用されます。
そーゆー感じのことを推移的依存関係と言います。
「推移的」に関しては「つられてバージョンあがっちゃった💦」みたいに解釈してます。私は。
どんなシチュエーションで知りたくなる
業務で何かしらのライブラリのバージョンをアップデートするときに、つられて上がっちゃう他のライブラリちゃんがないか調べておきたいですよね。
つられてあがっちゃったライブラリに破壊的変更が含まれていたら悲しいですから、アップデートして大丈夫そうかどうか確認しておきたいです。
どんなツールでわかりやすく見れる
dependency-diff-tldr を使いましょう。
こんな感じで簡単に推移的依存関係のアップグレードを確認できます
New Dependencies
com.careem.identity:user-profile:0.0.63
project :miniapp:thirdparty
Upgraded Dependencies
androidx.annotation:annotation-experimental:1.0.0, (upgraded from 1.0.0-rc01)
androidx.constraintlayout:constraintlayout:2.0.2, (upgraded from 2.0.1)
androidx.constraintlayout:constraintlayout-solver:2.0.2, (upgraded from 2.0.1)
com.careem.care:helpcenter:0.0.17, (upgraded from 0.0.16)
com.careem.chat:core:3.1.6, (upgraded from 3.1.4)
これをプルリクのコメントとかにもはっちゃったりして、レビュアーに親切なプルリクを作れます
導入方法
githubのReleasesを見にいきます。
そして最新バージョンのAssetsからdependency-diff-tldr-r8.jar
をクリックしてダウンロードします。
使い方
ライブラリアップデート前の状態で以下のコマンドを叩きます。
このコマンドで、old.txt
というファイルを作成し、appモジュールの実行時に関連するライブラリの依存関係を取得してファイルに書き出します。
(実際に書き出せているかはvim old.txt
で確認してみましょう。)
./gradlew :app:dependencies --configuration releaseRuntimeClasspath > old.txt
releaseRuntimeClasspath
は実行中のアプリケーションがクラスやリソースを検索する場所(実行時クラスパス)を示すものです。
通常、リリースタスクの実行時クラスパスと実際に取り込んでいるライブラリは一致します。
なので、アプリが使用しているライブラリの一覧を知るためにはreleaseRuntimeClasspath
を見れば良いことになります。
[ビルドバリアント]RuntimeClasspath
とすることでそのビルドバリアントでの実行時のクラスパスを指定します。
次に、ライブラリのバージョンをアップデートして、以下のコマンドを叩きます。
このコマンドでも同様に新しいバージョン後の実行時に関連するライブラリの依存関係を取得してnew.txt
ファイルに書き出します。
./gradlew :app:dependencies --configuration releaseRuntimeClasspath > old.txt
最後に、以下のコマンドでold.txt
とnew.txt
を比較します。
java -jar dependency-diff-tldr-r8.jar old.txt new.txt
old.txt
とnew.txt
とdependency-diff-tldr-r8.jar
が同じディレクトリにあることを確認してください。異なる場所にある場合はそれぞれのフルパスを明記してください
java -jar [dependency-diff-tldr-r8.jarのパス] [old.txtのパス] [new.txtのパス]
そしたらターミナル上に次のような一覧が表示されるはずです。
Upgraded Dependencies
androidx.room:room-common:2.6.1, (changed from 2.5.2)
androidx.sqlite:sqlite:2.4.0, (changed from 2.3.1)
org.jetbrains.kotlin:kotlin-stdlib:1.9.22, (changed from 1.7.21)
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1, (changed from 1.6.4)
...
org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.1, (changed from 1.6.4)
coroutineのバージョンが1.6.4
から1.7.1
にアップグレードされていルナあとかが分かりますね。