2013-08-23 12 views
9

Arbeiten an einer Android-Bibliothek mit Gradle (v 1.7) als Bauwerkzeug, habe ich das Maven-Plugin verwendet und konfiguriert die Aufgabe uploadArchives zu veröffentlichen sowohl Release-und Debug-Version von die lib zum lokalen maven repository.
Der folgende Code funktioniert ok:Gradle und Android: Pom-Konfiguration mit mehreren Maven-Artefakte Veröffentlichung

// [...] 
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) 

, jedoch beim Versuch, die pom Konfiguration Refactoring:

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 wie der Name der Ausgabedatei erweitert wird, und groupId als der Name des Wurzelverzeichnisses; Das gibt schlechte Wege im Maven Repo.

Ich würde gerne wissen, warum das ist, und vielleicht, wenn es einen saubereren Weg zu erreichen, was ich brauche.

+0

In meinem Projekt hatte ich die Anforderung, den Ausgang '.aar' umzubenennen. Deshalb habe ich 'archivesBaseName' in' build.gradle' gesetzt, das für die 'artifactId' verwendet wird. Vielleicht hilft das. – JJD

+0

Haben Sie das herausgefunden? –

+0

@YuchenZhong Leider nicht, da diese Arbeit Teil eines Kurzzeitpraktikums war. Ich weiß nicht, wer das Projekt übernommen hat und wie es seitdem gehandhabt wurde. – mklj

Antwort

3

Als Referenz laden wir so mehrere APKs hoch. Es ist möglicherweise nicht genau das, was Sie benötigen, da wir mehrere APKs nach APK-Splits hochladen, während Sie versuchten, mehrere APKs von verschiedenen Build-Typen hochzuladen (debug & Release). Aber theoretisch sollten sie gleich sein.

//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

Groß +1. Genau das, was ich auf Abis teilen musste. Ich habe nur ein paar fehlende Teile für andere Entwickler hinzugefügt. –

+0

Hey, @RafaelT Ich glaube nicht, dass 'zipAlignEnabled true' benötigt wird, da es standardmäßig auf 'production build' gesetzt ist. https://Stackoverflow.com/a/27945728/1035008 –

+0

true, ich habe gerade den buildType 'productionRelease' hinzugefügt, weil es @Yuchen Zhong komplett fehlte –

0

Sie benötigen (ed) den Filternamen setzen für die groupId und artifactId das gleiche wie Sie für 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 überrascht Sie mit dem Versionsnamen Suffix weg, als nicht für immer.

Verwandte Themen