ultima - Configuración de Gradle con biblioteca de Android de varios módulos
ultima version de gradle (1)
Historia anterior
Tengo esta biblioteca de aar
que los desarrolladores pueden usar normalmente con
compile ''com.companyname.sdk:android-sdk:2.x''
y ahora estamos reescribiendo la biblioteca desde cero para crear V3.
En esta reorganización, logramos dividir la lib en módulos. Así que uno podría decir que en V3 tendríamos los siguientes artefactos
compile ''com.companyname.sdk:core:3.x''
compile ''com.companyname.sdk:extra_1:3.x''
compile ''com.companyname.sdk:extra_2:3.x''
compile ''com.companyname.sdk:extra_ ....
y esto daría a la estructura gradle los siguientes módulos:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- sdk (aka: core)
|- extra_1
|- extra_2
|- extra_ ... etc
para cada módulo extra
en su build.gradle
hay un provided ('':sdk'')
para que pueda usar todo desde el módulo sdk
, pero en realidad no compilarlo dentro de sí mismos.
pero también me gustaría proporcionar una ruta de migración sencilla para las aplicaciones de host existentes. Es decir, me gustaría que en V3 también tenga el siguiente artefacto que combina core
y extra_1
(que básicamente es lo que está actualmente en V2).
compile ''com.companyname.sdk:android-sdk:3.0.0''
Todo eso suena muy bien en teoría, pero me está resultando muy difícil descifrar una estructura de gradle que me permita exportar fácilmente todo eso.
Lo que quiero lograr
Así que me gustaría poder generar durante una compilación los siguientes artefactos:
-
android-sdk
que incluye tantocore
comoextra_1
-
core
-
extra_1
- ... todos los demás extras
¿Qué he intentado?
agregue un módulo adicional llamado
legacy
, apliquecom.android.library
sin ningún código y agregue elcompile project
para los otros dos módulos. Genera unaar
vacíoagregue buildTypes core / legacy con los sourceSets de ambos módulos. Nunca generó 2
aar
agregue productFlavours core / legacy con los sourceSets de ambos módulos. No se compila porque no puede encontrar las importaciones de
sdk
declaradas enextra_1
(algunas de las cuales se generan durante el procesador de anotación, o lombok)agregue
compile project(''extra_1'')
core / legacy con elcompile project(''extra_1'')
. No compila porque hay una dependencia cíclica entre sdk y extra_1.
Responder
Basado en la respuesta de Gabrielle terminé cavando más y descubrí que la opción de crear un módulo adicional con las dependencias es la correcta. Generará un AAR con manifiesto vacío y clases vacías. Pero la parte importante es el archivo POM que generará que incluirá las dependencias correctas.
Una advertencia sobre el enfoque está en la configuración del plugin maven-publish
. Normalmente necesita un objeto de publications
con publications
y un nodo pom.withXml
. el mío era como seguir:
pom.withXml {
def root = asNode()
def license = root.appendNode(''licenses'').appendNode(''license'')
license.appendNode(''name'', ''The Apache Software License, Version 2.0'')
license.appendNode(''url'', ''http://www.apache.org/licenses/LICENSE-2.0.txt'')
license.appendNode(''distribution'', ''repo'')
def dependenciesNode = asNode().appendNode(''dependencies'')
configurations.compile.allDependencies.each { dependency ->
def dependencyNode = dependenciesNode.appendNode(''dependency'')
dependencyNode.appendNode(''groupId'', dependency.group)
dependencyNode.appendNode(''artifactId'', dependency.name)
dependencyNode.appendNode(''version'', dependency.version)
}
}
El problema con ese enfoque es que dependency.version
(al final) no se especifica, y como tal genera un archivo POM con <version>unspecified</version>
.
La solución es simple, reemplace el retraso con alguna variable que tenga en el guión con el número de versión correcto. El mío se veía así:
dependencyNode.appendNode(''version'', "${rootProject.ext.SDK_VERSION}")
Deberías hacer algo como esto:
root:
|- test_app (apk just for testing, not deployed anywhere)
|- core
|- extra_1
|- extra_2
|- extra_ ... etc
|- android-sdk
En core/build.gradle
:
apply plugin: ''com.android.library''
//...
En extra1/build.gradle
:
apply plugin: ''com.android.library''
//...
dependencies {
compile project('':core'')
}
En android-sdk/build.gradle
:
apply plugin: ''com.android.library''
//...
dependencies {
compile project('':core'')
compile project('':extra'')
}