Android專案用.toml遷移至version catalogs會遇到的問題
-
自從之前專案改成
.kts
來build專案後
官方也出了一篇文章旨在遷移專案到version catalogs版本目錄
加入後在Android Studio可以看到以Android為目錄時會顯示在下方
這樣就可以少一步(不用雙Shift再去搜尋XD)
用點擊的就可以看到內容 -
像是以前建立一個Dependence.kt這種可能就要用雙Shift去搜尋
或去../Dependence.kt
下尋找
-
因為後面比較新的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設定有衝突
- 第一次用
.toml
時會發現為啥有些沒配置version.ref
還是能正常build
這是因為當你引入composeBom
的時候
再導入其他相關library且不設定版本時
他會根據你設定的composeBom版本
自動去mapping相關的library version
這樣其實只要設定composeBom 就能讓其有支援自動導入的地方設定成相容的版本了
滿方便的! - 參考Bom mapping了解對應的版本
遷移解說
在../gradle目錄底下創建lib.version.toml根據你的需求分別加入[versions]、[libraries]、[plugins]
這邊官方建議的命名方式為kebab case
是可以更好的補全代碼
例如下方代碼:
實際使用
當你加完toml後,按下sync now同步一下之後就可以直接在build.gradle.kts中直接使用
例如下方代碼: