web-dev-qa-db-fra.com

Dans Gradle, comment déclarer des dépendances communes à un seul endroit?

Dans Maven, il existe une fonctionnalité très utile lorsque vous pouvez définir une dépendance dans la section <dependencyManagement> du POM parent et référencer cette dépendance à partir de modules enfants sans spécifier la version, l'étendue ou autre.

Quelles sont les alternatives à Gradle?

94

Vous pouvez déclarer des dépendances communes dans un script parent:

ext.libraries = [ // Groovy map literal
    spring_core: "org.springframework:spring-core:3.1",
    junit: "junit:junit:4.10"
]

À partir d'un script enfant, vous pouvez ensuite utiliser les déclarations de dépendance comme suit:

dependencies {
    compile libraries.spring_core
    testCompile libraries.junit
}

Pour partager des déclarations de dépendance avec des options de configuration avancées, vous pouvez utiliser DependencyHandler.create:

libraries = [
    spring_core: dependencies.create("org.springframework:spring-core:3.1") {
        exclude module: "commons-logging"
        force = true
    }
]

Plusieurs dépendances peuvent être partagées sous le même nom:

libraries = [
    spring: [ // Groovy list literal
        "org.springframework:spring-core:3.1", 
        "org.springframework:spring-jdbc:3.1"
    ]
]

dependencies { compile libraries.spring } ajoutera alors les deux dépendances à la fois.

La seule information que vous ne pouvez pas partager de cette manière est la configuration ( scope en termes Maven) à laquelle une dépendance doit être affectée. Cependant, d'après mon expérience, il vaut mieux être explicite à ce sujet de toute façon.

160

C'est une réponse tardive, mais vous voudrez peut-être aussi regarder: http://plugins.gradle.org/plugin/io.spring.dependency-management Il offre la possibilité d'importer un maven bom ', et réutilise les définitions définies dans le' bom '. C’est certainement une aide précieuse lorsqu’on passe progressivement de maven à gradle! En profiter dès maintenant.

6
roomsg

A partir de Gradle 5.0 (ou peut-être plus tôt?), Des contraintes de dépendance sont suggérées dans la documentation pour y parvenir. De https://docs.gradle.org/current/userguide/declaring_dependencies.html#declaring_a_dependency_without_version :

Une pratique recommandée pour les projets plus importants consiste à déclarer des dépendances sans version et à utiliser des contraintes de dépendance pour la déclaration de version. L'avantage est que les contraintes de dépendance vous permettent de gérer les versions de toutes les dépendances, y compris celles transitives, en un seul endroit.

Dans votre fichier build.gradle parent:

allprojects {
  plugins.withType(JavaPlugin).whenPluginAdded {
    dependencies {
      constraints {
        implementation("com.google.guava:guava:27.0.1-jre")
      }
    }
  }
}

Envelopper le bloc des dépendances avec une vérification du plug-in Java (... whenPluginAdded {) n'est pas strictement nécessaire, mais il gérera ensuite l'ajout d'un projet non Java à la même construction.

Ensuite, dans un projet de catégorie enfant, vous pouvez simplement omettre la version:

apply plugin: "Java"

dependencies {
  implementation("com.google.guava:guava")
}

Les générations enfants peuvent toujours choisir de spécifier une version supérieure. Si une version inférieure est spécifiée, elle est automatiquement mise à niveau vers la version dans la contrainte.

3
Adrian Baker

Le plugin io.spring.gradle:dependency-management-plugin a des problèmes avec la nouvelle série Gradle 3.x, mais est stable pour la série 2.x. Pour référence, consulter le rapport de bogue Suppression de la prise en charge de Gradle 3 # 115

En cas de Spring ( promoteur principal de l'utilisation de la nomenclature ), vous pouvez terminer par:

buildscript {
    repositories {
        mavenLocal()
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:1.0.0.RELEASE'
    }
}

repositories {
    mavenLocal()
    jcenter()
}

apply plugin: 'Java'
apply plugin: 'io.spring.dependency-management'

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-SR3'
    }
}

dependencies {
    compile 'org.springframework.boot:spring-boot-starter-web'

    testCompile 'org.springframework.boot:spring-boot-starter-test'
}

Notez que io.spring.platform:platform-bom a pour parent org.springframework.boot:spring-boot-starter-parent, ce qui le rend compatible avec Spring Boot.

Vous pouvez vérifier la résolution de dépendance actuelle via:

$ gradle dependencies
$ gradle dependencies --configuration compile
$ gradle dependencies -p $SUBPROJ

$ gradle buildEnvironment
$ gradle buildEnvironment -p $SUBPROJ

ou avec tâche:

task showMeCache {
    configurations.compile.each { println it }
}

Lisez le billet officiel du blog Soring Meilleure gestion des dépendances pour Gradle pour comprendre la raison de l'introduction de io.spring.gradle:dependency-management-plugin.

2
gavenkoa

Cet article de blog suggère de gérer les dépendances et les groupes en tant que configurations: https://www.javacodegeeks.com/2016/05/manage-dependencies-gradle-multi-project-build.html

Je n'ai pas essayé moi-même, mais ça a l'air intéressant.

Projet racine build.gradle

subprojects {
  configurations {
    commonsIo
  }

  dependencies {
    commonsIo 'commons-io:commons-io:2.5'
  }
}

Sous-projet build.gradle

configurations {
  compile.extendsFrom commonsIo
}
1
tkruse

Pour que votre fichier reste propre, nous pouvons regrouper les dépendances dans un tableau et les implémenter ultérieurement.

  1. Ajouter une version de bibliothèques comme celle-ci dans build.gradle (niveau de l'application) en dehors du bloc de dépendance:

// déclare les versions de la bibliothèque

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'
  1. Créez un tableau de dépendances associées afin de pouvoir le retrouver facilement plus tard. Ajoutez-le dans build.gradle (niveau de l'application) en dehors du bloc de dépendance:

// Utiliser la version dans la bibliothèque et ajouter une dépendance avec un nom d'accès (comme retrofit (premier))

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]
  1. Et dans bloc de dépendance:

// Implémente toute la dépendance du tableau

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}

Donc le code final ressemblera à ceci:

final RetrofitVersion = '2.3.0'
final OkHttpVersion = '3.9.1'

final networkDependencies = [
        retrofit             : "com.squareup.retrofit2:retrofit:${RetrofitVersion}",
        retrofitGsonConverter: "com.squareup.retrofit2:converter-gson:${RetrofitVersion}",
        retrofitRxJavaAdapter: "com.squareup.retrofit2:adapter-rxjava2:${RetrofitVersion}",
        okHttp3              : "com.squareup.okhttp3:okhttp:${OkHttpVersion}",
        okHttp3Logging       : "com.squareup.okhttp3:logging-interceptor:${OkHttpVersion}"
]

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation networkDependencies.values()
}
0
Suraj Vaishnav