2013-08-23 15 views
9

Lavorando su una libreria Android con Gradle (v 1.7) come strumento di costruzione, ho utilizzato il plugin Maven e configurato l'uploadArchives delle attività per pubblicare sia la versione di debug che di rilascio la lib al repository maven locale.
Il seguente codice funziona bene:Gradle e Android: pom configurazione con pubblicazione di più artefatti Maven

// [...] 
apply plugin: 'android-library' 

// [...] nothing unusual 

/* 
* Define name of the apk output file (build/apk/<outputFile>) 
*/ 
    android.libraryVariants.all 
    { 
     variant -> 
     def outputName = "MyModule-${android.defaultConfig.versionName}-${variant.baseName}.aar" 
     variant.outputFile = new File("$buildDir/libs", outputName) 
    } 


/* 
* Publish to maven local repo (older style maven plugin) 
* Used while android plugin is not fixed regarding maven-publish plugin 
* 
* type command "gradle uploadArchives" to publish the module into the 
* local .m2 repository 
*/ 
apply plugin: 'maven' 

android.libraryVariants.all 
{ 
    variant -> 
    // add final apk to the 'archives' configuration 
    project.artifacts 
    { 
     archives variant.outputFile 
    } 
} 

def localRepoPath = "file://" + new File(
    System.getProperty("user.home"), ".m2/repository").absolutePath 

uploadArchives 
{ 
    repositories.mavenDeployer 
    {  
     repository(url: localRepoPath) 

     addFilter('debug') { artifact, file -> 
      artifact.name.contains("debug") 
     } 
     addFilter('release') { artifact, file -> 
      artifact.name.contains("release") 
     } 

     pom('debug').groupId = 'com.company' 
     pom('release').groupId = 'com.company' 
     pom('debug').artifactId = 'id' 
     pom('release').artifactId = 'id' 
     pom('debug').version = android.defaultConfig.versionName + "d" 
     pom('release').version = android.defaultConfig.versionName 
     pom.packaging = 'aar' 
    } 
} 
uploadArchives.dependsOn(assemble) 

Tuttavia, quando si cerca di refactoring la configurazione pom:

uploadArchives 
{ 
    repositories.mavenDeployer 
    {  
     repository(url: localRepoPath) 

     addFilter('debug') { artifact, file -> 
      artifact.name.contains("debug") 
     } 
     addFilter('release') { artifact, file -> 
      artifact.name.contains("release") 
     } 

     pom.groupId = 'com.company' 
     pom.artifactId = 'id' 
     pom('debug').version = android.defaultConfig.versionName + "d" 
     pom('release').version = android.defaultConfig.versionName 
     pom.packaging = 'aar' 
    } 
} 

artifactId si espande come il nome del file di output, e groupId come il nome della directory root; dando così cattivi percorsi nel repository di musica.

Mi piacerebbe sapere perché è questo, e forse se c'è un modo più pulito per ottenere ciò di cui ho bisogno.

+0

Nel mio progetto ho avuto l'obbligo di rinominare l'output '.aar'. Pertanto, ho impostato 'archivesBaseName' in' build.gradle', che è usato per 'artifactId'. Forse questo aiuta. – JJD

+0

Hai capito? –

+0

@YuchenZhong Sfortunatamente no, poiché questo lavoro faceva parte di uno stage di breve durata. Non so chi è stato a capo del progetto e quindi come è stato gestito da allora. – mklj

risposta

3

Come riferimento, questo è il modo in cui carichiamo più APK. Potrebbe non essere esattamente quello di cui avevi bisogno dal momento che stiamo caricando più APK dopo la divisione di APK, mentre cercavi di caricare più APK da diversi tipi di build (versione di debug &). Ma in teoria dovrebbero essere uguali.

//declare some Variables for later use 
def projectName = "ProjectName" 
def versionString = "1.0.0" 
def baseVersionCode = 1 

// Values based on https://developer.android.com/ndk/guides/abis.html#sa 
ext.abiCodes = ['armeabi-v7a': 1, 
       'arm64-v8a' : 2, 
       'x86'  : 3, 
       'x86_64'  : 4] 

// collect artifacts, important for the `uploadArchives` to work 
artifacts { 
    if (new File('app/build/outputs/apk').exists()) { 
    new File('app/build/outputs/apk').eachFile() { file -> 
     if (file.toString().contains("productionRelease")) { 
     archives file: file 
     } 
    } 
    } 
} 

uploadArchives { 
    repositories { 
    mavenDeployer { 
     repository(url: "http://...") 

     project.ext.abiCodes.values().each{ abiVersionCode -> 
     def version = "${versionString}.${baseVersionCode + abiVersionCode}" 
     addFilter(version) { artifact, file -> artifact.name.contains(version) } 

     pom(version).artifactId = projectName.toLowerCase() 
     pom(version).groupId = 'com.yourcompanyname' 
     pom(version).version = version 
     } 
    } 
    } 
} 

android { 
    defaultPublishConfig "productionRelease" 

    buildTypes { 
     productionRelease { 
      minifyEnabled false 
      zipAlignEnabled true 
      //...more Config like proguard or signing 
     } 
    } 

    applicationVariants.all { variant -> 
    variant.outputs.each { output -> 
     def abiName = output.getFilter(com.android.build.OutputFile.ABI) 
     def abiVersionCode = project.ext.abiCodes.get(abiName)  
     output.versionCodeOverride = variant.versionCode + abiVersionCode 
     output.versionNameOverride = "$versionString (${output.versionCodeOverride})" 
     def apkName = "$projectName-${variant.name}-v${versionString}.${output.versionCodeOverride}.apk" 
     output.outputFile = new File(output.outputFile.parent, apkName) 
    } 
    } 
+0

Ottimo +1. Esattamente quello che dovevo dividere su abis. Ho appena aggiunto alcuni pezzi mancanti per altri sviluppatori –

+0

Ehi, @RafaelT Non penso che 'zipAlignEnabled true' sia necessario poiché è impostato su true per impostazione predefinita per la build di produzione. https://stackoverflow.com/a/27945728/1035008 –

+0

true, ho appena aggiunto il buildType 'productionRelease' perché mancava totalmente @Yuchen Zhong –

0

È necessario (ed) per impostare il nome del filtro per la groupId e artifactId lo stesso che avete per version

pom('debug').groupId = 'com.company' 
pom('release').groupId = 'com.company' 
pom('debug').artifactId = 'id' 
pom('release').artifactId = 'id' 
pom('debug').version = android.defaultConfig.versionName + "d" 
pom('release').version = android.defaultConfig.versionName 

Im sorpreso che si ottiene via con il suffisso del nome di versione, come la sua non semver.

Problemi correlati