2013-08-23 16 views
9

Gradle के साथ एक Android पुस्तकालय पर कार्य के साथ पोम विन्यास (V 1.7) निर्माण उपकरण के रूप में, मैं Maven प्लगइन का इस्तेमाल किया और कार्य uploadArchives कॉन्फ़िगर कर लिया है के दोनों रिहाई और डिबग संस्करण प्रकाशित करने स्थानीय मैवेन भंडार के लिए lib।
कोड के नीचे ठीक काम करता है:Gradle और एंड्रॉयड: कई 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) 

हालांकि, जब पोम विन्यास refactor करने के लिए कोशिश कर रहा है: के रूप में

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 आउटपुट फ़ाइल के नाम के रूप में विस्तार किया गया है, और ग्रुप रूट निर्देशिका का नाम; इस प्रकार मैवेन रेपो में खराब पथ दे रहे हैं।

मैं जानना चाहते हैं क्यों कि, और शायद अगर वहाँ एक क्लीनर तरीका प्राप्त करने के लिए मैं क्या जरूरत है।

+0

मेरी परियोजना में मुझे आउटपुट '.ar' नाम बदलने की आवश्यकता थी। इसलिए, मैंने 'archivesBaseName' को' build.gradle' में सेट किया है जिसका उपयोग 'artifactId' के लिए किया जाता है। शायद यह मदद करता है। – JJD

+0

क्या आपने इसे समझ लिया है? –

+0

@ युचेनज़ोंग दुर्भाग्य से नहीं, क्योंकि यह काम एक अल्पकालिक इंटर्नशिप का हिस्सा था। मुझे नहीं पता कि इस परियोजना का प्रभार किसने लिया है, और इसलिए इसे कैसे संभाला गया है। – mklj

उत्तर

3

एक संदर्भ के रूप में, यह है कि हम कैसे एकाधिक APK अपलोड करते हैं। एपीके विभाजन के बाद हम कई एपीके अपलोड कर रहे हैं, इसलिए यह वही नहीं हो सकता है, जबकि आप विभिन्न बिल्ड प्रकारों (डीबग रिलीज) से कई एपीके अपलोड करने की कोशिश कर रहे थे। लेकिन सिद्धांत रूप में, वे वही होना चाहिए।

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

ग्रेट +1। वास्तव में मुझे अबिस पर विभाजित करने की आवश्यकता थी। साथी devs –

+0

हे, @RafaelT के लिए बस कुछ लापता टुकड़े जोड़े गए हैं, मुझे नहीं लगता कि 'zipAlignEnabled true' की आवश्यकता है क्योंकि यह उत्पादन निर्माण के लिए डिफ़ॉल्ट रूप से सही पर सेट है। https://stackoverflow.com/a/27945728/1035008 –

+0

सच है, मैंने अभी बिल्डटाइप 'उत्पादन रिलीज' जोड़ा है क्योंकि यह पूरी तरह गायब था @ युचेन झोंग –

0

आप (ईडी) की जरूरत है groupId और artifactId के रूप में आप 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 

के लिए आईएम हैरान आप संस्करण का नाम प्रत्यय के साथ दूर होने, अपने नहीं के रूप में है उसी के लिए फिल्टर नाम सेट करने semver।

संबंधित मुद्दे