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

前言
  • 自從之前專案改成.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 就能讓其有支援自動導入的地方設定成相容的版本了
    滿方便的!
  • 參考Bom mapping了解對應的版本
遷移version catalogs方法

遷移解說

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


根據你的需求分別加入[versions][libraries][plugins]
這邊官方建議的命名方式為kebab case
是可以更好的補全代碼
例如下方代碼:

實際使用

當你加完toml後,按下sync now同步一下
之後就可以直接在build.gradle.kts中直接使用
例如下方代碼:
參考來源

You might also enjoy