Comment configurer des dépendances dans un projet multi-modules Android Gradle avec des interdépendances?

La Question

comment configurer les dépendances des modules dans un projet Gradle Android, où les modules ont des dépendances entre eux, de sorte que je puisse déployer une construction d'un nouvel instantané ou une version de sortie de tous les modules en une seule fois?

Configuration Du Projet

j'ai un projet qui se compose de 2 modules: lib-core et lib-help, avec lib-help dépendant de lib-core. Je veux publier lib-core et lib-help séparément à Maven Central, Tel que le fichier pom de lib-help spécifie la dépendance de lib-core avec la version correcte.

Le projet est structuré comme suit:

/my-project-name
|
|--/lib-core
|  |-- build.gradle
|  |-- gradle.properties
|
|--/lib-help
|  |-- build.gradle
|  |-- gradle.properties
|
|-- build.gradle
|-- gradle.properties
|-- settings.gradle
|-- gradle-mvn-push.gradle

les fichiers de configuration du projet sont les suivants, ne montrant que les parties pertinentes (par le jugement):

paramètres.gradle:

include ':lib-core', ':lib-help'

gradle.propriétés:

GROUP=com.company
VERSION=5.0.0-SNAPSHOT

Grad-mvn-push.gradle:

apply plugin: 'maven'

afterEvaluate { project ->
    uploadArchives {
        repositories {
            mavenDeployer {
                // GROUP is defined in <root>/gradle.properties
                pom.groupId = GROUP
                // ARTIFACT is defined in <root>/<module>/gradle.properties
                pom.artifactId = ARTIFACT
                // VERSION is defined in <root>/gradle.properties
                pom.version = VERSION
            }
        }
    }
}

// Contains a lot more to fill in other meta-data like project name,
// developer name, github url, javadoc, signing of the artifacts, etc, etc..

lib-core/Grad.propriétés:

ARTIFACT=my-lib-core

lib-core / build.gradle:

apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

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

apply from: rootProject.file('gradle-mvn-push.gradle')

lib-help/Grad.propriétés:

ARTIFACT=my-lib-help

lib-aider/build.gradle:

apply plugin: 'com.android.library'

// Contains more code to configure the android stuff, not relevant for this question

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':lib-core')
}

apply from: rootProject.file('gradle-mvn-push.gradle')

le Problème

Quand je lance gradlew clean :lib-core:uploadArchives :lib-help:uploadArchives, tout se compile bien et les téléchargements sont poussés vers le bon dépôt. Dans le Gestionnaire de dépôt Nexus, je peux voir les artéfacts pour les deux modules avec le nom, la version, la signature, etc., mais la dépendance de lib-help sur lib-core dans le pom généré.xml est mal. Il utilise le nom du projet comme groupId, le nom du module comme artifactId et un nom de version non spécifié:

<dependency>
    <groupId>my-project-name</groupId>
    <artifactId>lib-core</artifactId>
    <version>unspecified</version>
    <scope>compile</scope>
</dependency>

par conséquent, les projets utilisant lib-help en tant que dépendance ne peut pas résoudre la dépendance lib-core. Les valeurs correctes qui auraient dû être dans la pom de lib-help.xml sont groupId = com.company, artifactId=my-lib-core et version = 5.0.0-SNAPSHOT.

pour corriger cela, j'ai pensé que j'utiliserais une dépendance maven dans lib-help, au lieu d'une dépendance de module, comme ceci:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.company:my-lib-core:' + VERSION
}

naturellement, cette version n'existe pas avant que la commande uploadArchives de lib-core ait été exécutée, mais gradle veut résoudre la les dépendances de tous les modules avant de commencer l'exécution d'une des commandes données. Ainsi, il ne peut pas résoudre cette dépendance et quitte avec une erreur lors de la configuration des projets gradle. Maintenant, je peux contourner cela en mettant temporairement la dépendance de lib-help à project(':lib-core'), puis libérer lib-core, puis ajuster la dépendance de lib-help à 'com.company:my-lib-core:5.0.0-SNAPSHOT', puis libérer lib-help, mais cela ne semble pas la bonne façon. Il invite les erreurs humaines (que faire si j'augmente accidentellement le nombre de version entre les commandes to uploadArchives?) et il prend plusieurs mesures manuelles, strictement ordonnées.

La Question (reprise)

comment configurer les dépendances des modules dans un projet Gradle Android, où les modules ont des dépendances entre eux, de sorte que je puisse déployer une construction d'un nouvel instantané ou une version de sortie de tous les modules en une seule fois? (par exemple, mais pas nécessairement, avec la commande gradlew clean :lib-core:uploadArchives :lib-help:uploadArchives)

16
demandé sur Jelle Fresen 2016-05-16 12:29:47

1 réponses

compile project(':core')), si vous réécrivez la POM avant de le télécharger:

afterEvaluate { project ->
  uploadArchives {
    repositories {
      mavenDeployer {
        // ... other config here ...

        pom.whenConfigured { pom ->
          pom.dependencies.forEach { dep ->
            if (dep.getVersion() == "unspecified") {
              dep.setGroupId(GROUP)
              dep.setVersion(VERSION_NAME)
            }
          }
        }
      }
    }
  }
}
https://github.com/hannesstruss/WindFish

9
répondu Hannes Struß 2016-07-03 11:48:32