KC Blog

Android專案用.toml遷移至version catalogs會遇到的問題

5 min read
AndroidDev#Kotlin
前言
* 自從之前專案改成`.kts`來build專案後

官方也出了一篇文章旨在遷移專案到version catalogs版本目錄

加入後在Android Studio可以看到以Android為目錄時會顯示在下方

這樣就可以少一步(不用雙Shift再去搜尋XD)

用點擊的就可以看到內容

  • 像是以前建立一個Dependence.kt這種可能就要用雙Shift去搜尋

或去../Dependence.kt下尋找

適用的AGP版本
  • 因為後面比較新的Android Studio版本

可以透過IDE新專案直接配置

但如果遇到比較舊的專案

在手動遷移上面就會在意需不需要更新AGP版本

且通常舊專案可能年代久遠

需要時間更新 或短時間沒有成本去優化的時候

可能會以維持原版本為考量

  • 所以去研究了一下

隨意拿我手邊的AS創建的AGP有配置toml的

直接就是8.4.0版

  • 爬了下Gradle官方文件 在7.0文件中 提到在7.0這次release支援了version catalogs這項實驗性功能

參考Gradle 7.0 release 那便是toml可以在7.x使用了

遷移可能會遇到的問題
* 有專案用到了這種方式引入library
implement("com.orhanobut:dialogplus:1.11@aar")

在後面有個@aar

但是toml在versions中不支援後面加入@aar

導致build不過

改成下方這樣即可

  • 過去會用kotlin object來配置版本參數,如下

如果想全部改成.toml 實測在外部存取.toml配置的version

不能像是libs直接用

libs.xx.xx.xxx去拿version

只能直接用get()去拿到.toml內Versions的值

如:libs.versions.minSdk.get().toInt()

不過如用此方式設定

在.toml裡面看不到哪處使用

aapt dump badging appName.apk去檢驗build出來的與ibs.versions.minSdk.get()設置的一致

  • 低於AGP 8.1.0的配置需要在加入plugin{}上方加入@Suppress("DSL_SCOPE_VIOLATION")

原因是因為IDE那邊的issue Version catalog accessors for plugin aliases shown as errors in IDE kotlin script editor #22797

  • 再來就是[plugins]下的version.ref

不能設成null或empty

因為有些專案是拿plugin + classpath去設置

會讓直接用plugins設定有衝突

為啥有些library沒設定version.ref還是能Build
* 第一次用`.toml`時會發現為啥有些沒配置version.ref

還是能正常build

這是因為當你引入composeBom的時候

再導入其他相關library且不設定版本時

他會根據你設定的composeBom版本

自動去mapping相關的library version

這樣其實只要設定composeBom 就能讓其有支援自動導入的地方設定成相容的版本了

滿方便的!

遷移version catalogs方法

遷移解說

../gradle目錄底下創建lib.version.toml

根據你的需求分別加入[versions][libraries][plugins]

這邊官方建議的命名方式為kebab case

是可以更好的補全代碼

例如下方代碼:

實際使用

當你加完toml後,按下sync now同步一下

之後就可以直接在build.gradle.kts中直接使用

例如下方代碼:

參考來源
- Android developer官方文件