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>
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.
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)
}
}
}
}
}
}
}
}
}
}
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)
}
}
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
}
}