大規模なマルチモジュール Android (または任意の Gradle ベース) プロジェクトでは、バージョン管理が少し面倒になり始めます。
この問題に対処する最も一般的な方法は buildSrc を使用することですが、これの問題は、buildSrc の変更によりビルド プロセス全体でキャッシュが無効になり、ビルド時間が増加することです。
どうやら行動喚起が buildSrc から includeBuild に移動されたようです
他のカスタム ビルド ロジックやビルド プラグインがある場合は、includeBuild メカニズムに移行することは確かに理にかなっていますが、buildSrc に依存関係のバージョン管理のみが必要な場合は、より良い方法があります。gradle バージョン ディレクトリです。
バージョンとライブラリを settings.gradle(.kts) に追加します
注: kotlin のビルド スクリプトの方が DX (オートコンプリート、リンティングなど) が優れているため、私の例はすべて kts で示されています。
たとえば、これは私が settings.gradle.kts に追加したものです(その後その行で展開されます)
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
google()
mavenCentral()
}
versionCatalogs {
create("libs") {
version("androidx.navigation", "2.4.1")
version("android.material", "1.7.0-alpha01")
version("moshi", "1.13.0")
version("retrofit", "2.9.0")
version("moshi", "1.13.0")
library("android.material", "com.google.android.material", "material").versionRef("android.material")
library("androidx.navigation.fragment", "androidx.navigation", "navigation-fragment-ktx").versionRef("androidx.navigation")
library("androidx.navigation.ui", "androidx.navigation", "navigation-ui-ktx").versionRef("androidx.navigation")
library("androidx.core", "androidx.core:core-ktx:1.7.0")
library("androidx.appcompat", "androidx.appcompat:appcompat:1.4.1")
library("okhttp", "com.squareup.okhttp3:okhttp:5.0.0-alpha.6")
library("retrofit", "com.squareup.retrofit2", "retrofit").versionRef("retrofit")
library("retrofit.converter.moshi", "com.squareup.retrofit2", "converter-moshi").versionRef("retrofit")
library("moshi", "com.squareup.moshi", "moshi-kotlin").versionRef("moshi")
library("moshi.compiler", "com.squareup.moshi", "moshi-kotlin-codegen").versionRef("moshi")
bundle("androidx.appcompat", listOf("androidx.core", "androidx.appcompat"))
bundle("androidx.navigation", listOf("androidx.navigation.fragment", "androidx.navigation.ui"))
bundle("retrofit", listOf("retrofit", "retrofit.converter.moshi"))
}
}
}
- 「ライブラリ」ブロックを作成する
dependencyResolutionManagement {
versionCatalogs {
create("libs") {...}
}
}
2. バージョン定数を追加する
version("android.material", "1.7.0-alpha01")
version("moshi", "1.13.0")
version("retrofit", "2.9.0")
3. 各依存関係を追加します
バージョン定数 versionRef() を参照できます
library("android.material", "com.google.android.material", "material").versionRef("android.material")
- 一緒に使用するライブラリのセットがある場合は、「バンドル」を作成します
bundle("androidx.appcompat", listOf("androidx.core", "androidx.appcompat"))
build.gradle(.kts) はファイル内のバージョン カタログを使用します
モジュールの build.gradle でこれらを使用する方法は次のとおりです
dependencies {
implementation(libs.bundles.androidx.appcompat)
implementation(libs.android.material)
implementation("androidx.constraintlayout:constraintlayout:2.1.3")
implementation(libs.bundles.androidx.navigation)
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.3")
androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
}
通常のライブラリはこのように使用します
implementation(libs.android.material)
このようにバンドル全体を追加することもできますが、
implementation(libs.android.material)
何がうまくいかないのでしょうか?
注意すべき点がいくつかあります
グラドル 7.4+
Gradle 7.3 以前を使用している場合、リリース ディレクトリは不安定/実験的な API であるため、そのようにマークする必要があります。 7.4 以降、デフォルトで有効になっています
Android Studio のバージョン管理のサポート
バージョン ディレクトリ内の依存関係は Android Studio のプロジェクト構造オプションには表示されず、Studio は古い依存関係を更新するように通知しません。
以下に示すように、バージョン ディレクトリに関する警告が表示され、バージョン ディレクトリの依存関係が表示されません。
オートコンプリートは Kotlin でのみ機能します
build.gradle.kts(kotlinscript) の代わりに build.gradle(groovy) を使用する場合、libs.x.y 依存関係のオートコンプリートや型チェックは行われません。
以下は、.kts ファイル内でのみ機能するオートコンプリート機能です。