web-dev-qa-db-fra.com

Gradle n'incluant pas les dépendances dans pom.xml publié

J'ai un projet Gradle que j'utilise le plugin maven-publisher pour installer ma bibliothèque Android pour maven local et un repo Maven.

Cela fonctionne, mais le pom.xml généré n'inclut aucune information de dépendance. Existe-t-il une solution de contournement pour inclure ces informations, ou suis-je obligé de revenir au plugin maven et de faire toute la configuration manuelle qui nécessite?


En recherchant, j'ai réalisé que je ne dis pas à la publication où se trouvent les dépendances, je spécifie uniquement la sortie/l'artefact, j'ai donc besoin d'un moyen de lier cela MavenPublication aux dépendances , mais je n'ai pas encore trouvé comment le faire dans la documentation.

 --------------------------------------------- --------------- 
 Gradle 1.10 
 ----------------------- -------------------------------------

Temps de construction: 2013-12-17 09:28:15 UTC 
 Numéro de build: aucun 
 Révision: 36ced393628875ff15575fa03d16c1349ffe8bb6 
 
 Groovy: 1.8.6 
 Ant: Apache Ant (TM) version 1.9.2 compilée le 8 juillet 2013 
 Ivy: 2.2.0 
 JVM: 1.7.0_60 (Oracle Corporation 24.60-b09) 
 OS: Mac OS X 10.9.2 x86_64 

Sections pertinentes de build.gradle

//...
apply plugin: 'Android-library'
apply plugin: 'robolectric'
apply plugin: 'maven-publish'

//...
repositories {
     mavenLocal()
     maven  {
         name "myNexus"
         url myNexusUrl
     }
     mavenCentral()
}

//...
Android.libraryVariants
publishing {
    publications {
        sdk(MavenPublication) {
            artifactId 'my-Android-sdk'
            artifact "${project.buildDir}/outputs/aar/${project.name}-${project.version}.aar"
        }
    }
    repositories {
        maven  {
            name "myNexus"
            url myNexusUrl
            credentials {
                username myNexusUsername
                password myNexusPassword
            }
        }
    }
}

Généré pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.Apache.org/POM/4.0.0 http://maven.Apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.Apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.example.Android</groupId>
  <artifactId>my-Android-sdk</artifactId>
  <version>gradle-SNAPSHOT</version>
  <packaging>aar</packaging>
</project>
41
C. Ross

J'ai pu contourner ce problème en demandant au script d'ajouter les dépendances au pom directement à l'aide de pom.withXml.

//The publication doesn't know about our dependencies, so we have to manually add them to the pom
pom.withXml {
    def dependenciesNode = asNode().appendNode('dependencies')

    //Iterate over the compile dependencies (we don't want the test ones), adding a <dependency> node for each
    configurations.compile.allDependencies.each {
        def dependencyNode = dependenciesNode.appendNode('dependency')
        dependencyNode.appendNode('groupId', it.group)
        dependencyNode.appendNode('artifactId', it.name)
        dependencyNode.appendNode('version', it.version)
    }
}

Cela fonctionne pour mon projet, cela peut avoir des conséquences imprévues dans d'autres.

72
C. Ross

J'ai mis à niveau la solution C.Ross. Cet exemple générera pom.xml avec des dépendances de la configuration de compilation et également avec des dépendances de type de construction spéciales, par exemple si vous utilisez différentes dépendances pour la version de publication ou de débogage (debugCompile et releaseCompile). Et aussi l'ajout d'exlusions

publishing {
    publications {
        // Create different publications for every build types (debug and release)
        Android.buildTypes.all { variant ->
            // Dynamically creating publications name
            "${variant.name}Aar"(MavenPublication) {

                def manifest = new XmlSlurper().parse(project.Android.sourceSets.main.manifest.srcFile);
                def libVersion = manifest['@Android:versionName'].text()
                def artifactName = project.getName()

                // Artifact properties
                groupId GROUP_ID
                version = libVersion
                artifactId variant.name == 'debug' ? artifactName + '-dev' : artifactName

                // Tell maven to prepare the generated "*.aar" file for publishing
                artifact("$buildDir/outputs/aar/${project.getName()}-${variant.name}.aar")

                pom.withXml {
                    //Creating additional node for dependencies
                    def dependenciesNode = asNode().appendNode('dependencies')

                    //Defining configuration names from which dependencies will be taken (debugCompile or releaseCompile and compile)
                    def configurationNames = ["${variant.name}Compile", 'compile']

                    configurationNames.each { configurationName ->
                        configurations[configurationName].allDependencies.each {
                            if (it.group != null && it.name != null) {
                                def dependencyNode = dependenciesNode.appendNode('dependency')
                                dependencyNode.appendNode('groupId', it.group)
                                dependencyNode.appendNode('artifactId', it.name)
                                dependencyNode.appendNode('version', it.version)

                                //If there are any exclusions in dependency
                                if (it.excludeRules.size() > 0) {
                                    def exclusionsNode = dependencyNode.appendNode('exclusions')
                                    it.excludeRules.each { rule ->
                                        def exclusionNode = exclusionsNode.appendNode('exclusion')
                                        exclusionNode.appendNode('groupId', rule.group)
                                        exclusionNode.appendNode('artifactId', rule.module)
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
29
cooperok

Avec gradle 3 implemention a été introduit pour remplacer compile. Utilisez-le à la place.

pom.withXml {
    def dependenciesNode = asNode().appendNode('dependencies')
    configurations.implementation.allDependencies.each {
        def dependencyNode = dependenciesNode.appendNode('dependency')
        dependencyNode.appendNode('groupId', it.group)
        dependencyNode.appendNode('artifactId', it.name)
        dependencyNode.appendNode('version', it.version)
    }
}
2
Pedro Romão

Je suppose que cela a quelque chose à voir avec le from components.Java directive, comme vu dans le guide . J'avais une configuration similaire et cela a fait la différence d'ajouter la ligne dans le bloc de publication:

publications {
    mavenJar(MavenPublication) {
        artifactId 'rest-security'
        artifact jar
        from components.Java
    }
}
0
Peter and the Wolf