2013-08-23 20 views
9

ビルドツールとしてGradle(v 1.7)を使用してAndroidライブラリを操作すると、mavenプラグインを使用してタスクuploadArchivesを設定してリリースとデバッグの両方のバージョンを公開しましたlibをローカルMavenリポジトリにコピーします。
次のコードは、[OK]を動作します:Gradle and Android:複数のMavenアーティファクトを含むpom設定

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

しかし、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は次のように出力ファイル名として展開し、のgroupIdされますルートディレクトリの名前。このように、メイヴンレポに悪い道を与えている。

私はそれがなぜ、そして私が必要とするものを達成するためのよりクリーンな方法があるのか​​を知りたいと思います。

+0

私のプロジェクトでは、出力 '.aar'の名前を変更する必要がありました。したがって、 'artifactId'に使用される' build.gradle'に 'archivesBaseName'を設定しました。たぶんこれが役立ちます。 – JJD

+0

これは分かりましたか? –

+0

@YuchenZhong残念ながら、この仕事は短期インターンシップの一部ではありませんでした。私は誰がプロジェクトを担当したのか、それがどのように扱われたのか分かりません。 – mklj

答えて

3

参考として、これは複数のAPKをアップロードする方法です。異なるビルドタイプ(デバッグ&リリース)から複数のAPKをアップロードしようとしていたときに、APKが分割された後に複数のAPKをアップロードするため、必要なものとは限りません。しかし理論的には、彼らは同じでなければならない。

あなたは groupIdのフィルタ名を設定する(ED)が必要
//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。正確に私はabisに分割する必要があった。他の開発者に欠けているものをいくつか追加しました –

+0

ちょっと、@RafaelT 'zipAlignEnabled true'は、本番環境ではデフォルトでtrueに設定されているので、これは必要ないと思います。 https://stackoverflow.com/a/27945728/1035008 –

+0

本当に、ビルドタイプ 'productionRelease'を追加しました。なぜなら、それは完全に@Yuchen Zhongが不足していたからです –

0

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 

のためのイムはないとして、あなたはバージョン名の接尾辞で逃げる驚かセーバー

関連する問題