Catalogue de dépendances Gradle sur Android

Mar 24 2023
Une solution simple pour centraliser toutes les dépendances de votre projet et les partager. Le contrôle de version et la dépendance sur la plate-forme Android ne sont pas difficiles, mais peuvent parfois être désordonnés, entraînant des versions incompatibles dans votre projet.

Une solution simple pour centraliser toutes les dépendances de votre projet et les partager.

Le contrôle de version et la dépendance sur la plate-forme Android ne sont pas difficiles, mais peuvent parfois être désordonnés, entraînant des versions incompatibles dans votre projet.

Dans les gros projets, avec différentes équipes sur la même base de code, vous aurez probablement des conflits et nous savons tous qu'ils peuvent consommer notre temps pour les résoudre.

Dans cet esprit, Version Catalog est un moyen incroyable de résoudre ce problème, parlons de cette solution.

Catalogue de dépendances

Une solution facile pour centraliser toutes les dépendances de votre projet et maintenir leur visibilité pour être accessible n'importe où dans votre build.

Le catalogue est créé à l'aide d'un script gradle et d'un fichier toml. Voyons toutes les étapes pour mettre en œuvre l'approche du fichier toml de manière simple.

  1. Créez un fichier .toml nommé par convention " libs.versions.toml " dans le dossier gradle situé dans votre répertoire racine.

[versions] -> déclarer les versions
[libraries] -> déclarer l'alias de dépendance
[bundles] -> déclarer un bundle de dépendances
[plugins] -> déclarer les plugins

2. Paramètres de base du plug-in.

[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }

La référence des versions que nous déclarons dans la section [versions] :

[versions]
androidGradlePlugin = "7.4.0"
kotlin = "1.8.0"

[libraries]
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" }
androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "androidxComposeUi" }
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "androidxComposeUi" }
androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "androidxComposeMaterial" }
#test dependencies
junit = { module = "junit:junit", version.ref = "junit" }
androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidxTestExt" }
androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCore" }
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "androidxComposeUi" }
androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "androidxComposeUi" }

[versions]
androidGradlePlugin = "7.4.0"
kotlin = "1.8.0"
androidxCore = "1.9.0"
androidxLifecycle = "2.5.1"
androidxActivity = "1.6.1"
androidxComposeUi = "1.3.3"
androidxComposeMaterial = "1.3.1"
junit = "4.13.2"
androidxTestExt = "1.1.5"
espressoCore = "3.5.1"

Le dossier complet.

#/gradle/libs.versions.toml
[versions]
androidGradlePlugin = "7.4.0"
kotlin = "1.8.0"
androidxCore = "1.9.0"
androidxLifecycle = "2.5.1"
androidxActivity = "1.6.1"
androidxComposeUi = "1.3.3"
androidxComposeMaterial = "1.3.1"
junit = "4.13.2"
androidxTestExt = "1.1.5"
espressoCore = "3.5.1"

[libraries]
androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" }
androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" }
androidx-compose-ui = { module = "androidx.compose.ui:ui", version.ref = "androidxComposeUi" }
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling", version.ref = "androidxComposeUi" }
androidx-compose-material = { module = "androidx.compose.material:material", version.ref = "androidxComposeMaterial" }
#test dependencies
junit = { module = "junit:junit", version.ref = "junit" }
androidx-test-ext-junit = { module = "androidx.test.ext:junit", version.ref = "androidxTestExt" }
androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espressoCore" }
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "androidxComposeUi" }
androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "androidxComposeUi" }

[bundles]

[plugins]
android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" }
android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }

Déclarer un libs.versions.tomlfichier n'en fait pas la seule source de vérité pour les dépendances : c'est un emplacement conventionnel où les dépendances peuvent être déclarées. Dès que vous commencez à utiliser des catalogues, il est fortement recommandé de déclarer toutes vos dépendances dans un catalogue et de ne pas coder en dur les chaînes de groupe/artefact/version dans les scripts de construction. Sachez qu'il peut arriver que des plugins ajoutent des dépendances, qui sont des dépendances définies en dehors de ce fichier.

5. Enfin, remplacez nos dépendances, notez que vous pouvez déclarer l'alias avec "-", "_" et ".", mais dans le fichier gradle, il sera remplacé par ".'".

#/app/build.gradle

implementation 'androidx.core:core-ktx:1.9.0'
# became
implementation libs.androidx.core.ktx

#./build.gradle

dependencyResolutionManagement {
    defaultLibrariesExtensionName.set('projectLibs') # Add this line 
}

#app/build.gradle
implementation 'androidx.core:core-ktx:1.9.0'
# became
implementation projectLibs.androidx.core.ktx

#/app/build.gradle

id 'com.android.application'
# became
alias(libs.plugins.android.application)

#/gradle/libs.versions.toml

[versions]
androidGradlePlugin = "7.4.0"
kotlin = "1.8.0"
androidxCore = "1.9.0"
androidxLifecycle = "2.5.1"
androidxActivity = "1.6.1"
androidxComposeUi = "1.3.3"
androidxComposeMaterial = "1.3.1"
androidxComposeCompiler = "1.4.0" # Add the compiler version
junit = "4.13.2"
androidxTestExt = "1.1.5"
espressoCore = "3.5.1"
# app/build.gradle

composeOptions {
    # get the compile version
    kotlinCompilerExtensionVersion libs.versions.androidxComposeCompiler.get()
}

#/app/build.gradle

plugins {
    alias(libs.plugins.android.application)
    alias(libs.plugins.kotlin.android)
}

Mais, avec groovy, cela peut ne pas fonctionner au début, il existe une solution de contournement , ajoutez cette ligne sur votre root build.gradle.

#./build.gradle
buildscript {
    dependencies {
        classpath files(libs.class.superclass.protectionDomain.codeSource.location)
    }
}

C'est ainsi que je gère mes dépendances.

Obs. : Cela fonctionne exactement de la même manière avec gradle kotlin et groovy.

Que pouvons-nous faire de plus ?

  • Utilisez un fichier avec de nombreux projets, car nous pouvons spécifier le chemin du fichier.
  • dependencyResolutionManagement {
        versionCatalogs {
            libs {
                from(files("../../mainVersionFile/libs.versions.toml"))#path to the file
                #Add that config in all of your project to use one catalog to all of them
            }
        }
    }
    

  • Nous pouvons avoir plus d'un fichier par projet, nous pourrions donc avoir une dépendance de base et un autre fichier pour des dépendances spécifiques.
  • #/settings.gradle
    
    #add a list of file location
    versionCatalogs {
        libs {
            from(files("./gradle/main.libs.versions.toml"))
        }
        custom {
            #that list od dependency will be accessed with custom prefix
            #implementation custom.androidx.activity.compose
            from(files("./gradle/custom.libs.versions.toml"))
        }
    }
    
    #full code on branch: multi-toml-file
    

    #/build.gradle
    
    buildscript {
        dependencies {
            classpath files(libs.class.superclass.protectionDomain.codeSource.location)
            #add that line
            classpath files(custom.class.superclass.protectionDomain.codeSource.location)
        }
    }
    

Et la documentation officielle.
https://docs.gradle.org/current/userguide/platforms.html