In großen Android-Projekten mit mehreren Modulen (oder anderen Gradle-basierten Projekten) wird die Versionsverwaltung langsam zu einer Herausforderung.
Die häufigste Art und Weise, mit diesem Problem umzugehen, ist die Verwendung von buildSrc. Das Problem dabei ist jedoch, dass buildSrc-Änderungen während des gesamten Build-Prozesses zu einer Cache-Ungültigmachung führen und die Build-Zeit verlängern.
Anscheinend wurde der Call-to-Action nun von buildSrc nach includeBuild verschoben
Wenn Sie über andere benutzerdefinierte Build-Logik und Build-Plugins verfügen, ist es sicherlich sinnvoll, auf den Mechanismus includeBuild umzusteigen. Wenn Ihr buildSrc jedoch nur die Versionierung von Abhängigkeiten benötigt, gibt es einen besseren Weg – das Gradle-Versionsverzeichnis
Version und Bibliothek zu Settings.gradle(.kts) hinzufügen
Hinweis: Alle meine Beispiele sind in kts, da die Build-Skripte in Kotlin über bessere DX (Autovervollständigung, Linting usw.) verfügen.
Dies ist zum Beispiel das, was ich zu „settings.gradle.kts“ hinzugefügt habe (anschließend in der Zeile erweitert).
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"))
}
}
}
- Erstellen Sie einen „Bibliothek“-Block
dependencyResolutionManagement {
versionCatalogs {
create("libs") {...}
}
}
2. Versionskonstanten hinzufügen
version("android.material", "1.7.0-alpha01")
version("moshi", "1.13.0")
version("retrofit", "2.9.0")
3. Fügen Sie jede Abhängigkeit hinzu
Sie können auf die Versionskonstante versionRef() verweisen
library("android.material", "com.google.android.material", "material").versionRef("android.material")
- Wenn mehrere Bibliotheken zusammen verwendet werden, erstellen Sie ein „Bündel“.
bundle("androidx.appcompat", listOf("androidx.core", "androidx.appcompat"))
build.gradle(.kts) verwendet den Versionskatalog in der Datei
Die Methode, diese im build.gradle des Moduls zu verwenden, ist wie folgt
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")
}
Gewöhnliche Bibliotheken werden auf diese Weise verwendet
implementation(libs.android.material)
Es ist jedoch möglich, das gesamte Paket auf diese Weise hinzuzufügen
implementation(libs.android.material)
Was funktioniert nicht?
Es gibt einige Dinge zu beachten
Gradle 7.4+
Wenn Sie Gradle 7.3 oder niedriger verwenden, ist das Release-Verzeichnis eine instabile/experimentelle API und Sie müssen es als solche kennzeichnen. Ab 7.4 sind sie standardmäßig aktiviert
Android Studio-Unterstützung für die Versionsverwaltung
Abhängigkeiten im Versionsverzeichnis werden nicht in den Projektstrukturoptionen von Android Studio angezeigt und Studio erinnert Sie nicht daran, veraltete Abhängigkeiten zu aktualisieren.
Wie Sie unten sehen können, gibt es eine Warnung zum Versionsverzeichnis und die Abhängigkeiten des Versionsverzeichnisses werden nicht angezeigt
Autocomplete funktioniert nur in Kotlin
Wenn Sie build.gradle(groovy) anstelle von build.gradle.kts(kotlinscript) verwenden, erfolgt keine automatische Vervollständigung oder Typprüfung für die libs.x.y-Abhängigkeit
Nachfolgend finden Sie eine Funktion zur automatischen Vervollständigung, die nur innerhalb von .kts-Dateien funktioniert.