2015-12-17 21 views
28

Ich habe einige hinzugefügt flavors (oder productFlavors, wenn Sie wollen) zu meinem Projekt.Veröffentlichen Android-Bibliothek (aar) zu bintray mit ausgewählten Aromen

Tatsache ist, dass, wenn ich die Bibliothek zu bintray veröffentlichen, alle Aromen hochgeladen werden (was großartig ist), aber ich bin nicht in der Lage, sie zu verwenden. Das verwendete Plugin ist das offizielle here.

Die hochgeladene aar:

androidsdk-0.0.4-fullRelease.aar 
androidsdk-0.0.4-fullDebug.aar 
androidsdk-0.0.4-lightRelease.aar 
androidsdk-0.0.4-lightDebug.aar 

Wie Sie bemerkt, die fullRelease als classifier genannt, siehe doc chapter 23.4.1.3.

Ich bin auf der Suche nach einer Lösung zu wählen, welche Aromen, die ich hochladen möchte.

Ich habe schon bei bintray Beispielen (here und here) und this, mit auch anderen Beispielen gesucht, aber ich bin immer noch stecken.

Hier ist meine aktuelle Skript:

apply plugin: 'com.android.library' 
apply plugin: 'com.github.dcendents.android-maven' 
apply plugin: 'com.jfrog.bintray' 

buildscript { 
    repositories { 
     jcenter() 
    } 
} 

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     minSdkVersion 9 
     targetSdkVersion 23 
     versionCode 64 
     versionName "0.0.4" 
    } 

    publishNonDefault true 

    productFlavors { 
     full { 
     } 
     light { 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    compile 'com.android.support:appcompat-v7:23.1.1' 
    compile 'com.android.support:recyclerview-v7:23.1.1' 
    fullCompile 'com.squareup.picasso:picasso:2.5.0' 
} 

version = android.defaultConfig.versionName 

uploadArchives { 
    repositories.mavenDeployer { 
     pom.project { 

      packaging 'aar' 

     } 
    } 
} 

//////////////////////////////// 
// Bintray Upload configuration 

Properties properties = new Properties() 
properties.load(project.rootProject.file('local.properties').newDataInputStream()) 

bintray { 
    user = properties.getProperty("bintray.user") 
    key = properties.getProperty("bintray.apikey") 

    configurations = ['archives'] 
    pkg { 
     repo = "MyRepo" // repo name 
     userOrg = 'hugo' 
     name = "AndroidSDK" // Package name 
     websiteUrl = siteUrl 
     vcsUrl = gitUrl 
     publish = true 
    } 
} 

die Bibliothek importieren ich dies derzeit mit bin:

compile ('com.example.lib:sdk:0.0.8:[email protected]') { 
    transitive = true; 
} 
+0

Sie haben jeden Geschmack als ein anderes Artefakt zu aktualisieren. –

+0

@GabrieleMariotti Wie können Sie den Geschmack in den bintray 'Konfigurationen' spezifizieren? –

+0

Ich habe es vorher nicht versucht. Sie müssen jedoch einen Teil der bintray-Konfigurationen im Aromablock angeben, um den Artefaktnamen zuzuordnen. –

Antwort

8

stand ich vor der gleichen Herausforderung, und hier ist das Beste, was ich noch machen könnte:

Mit mavenPublications und das gradle maven-publish Plugin entlang der bintray Plugin, Sie jede Variante zu mavenLocal und bintray veröffentlichen.

Hier ist die publish.gradle Datei, die ich am Ende aller meiner Projektbibliotheksmodule I veröffentlichen möchten gelten:

def pomConfig = { 
    licenses { 
     license { 
      name 'The Apache Software License, Version 2.0' 
      url 'http://www.apache.org/licenses/LICENSE-2.0.txt' 
     } 
    } 
    developers { 
     developer { 
      id 'louiscad' 
      name 'Louis CAD' 
      email '[email protected]' 
     } 
    } 
    scm { 
     connection 'https://github.com/LouisCAD/Splitties.git' 
     developerConnection 'https://github.com/LouisCAD/Splitties.git' 
     url siteUrl 
    } 
} 

def publicationNames = [] 
publishing.publications { 
    android.libraryVariants.all { variant -> 
     if (variant.buildType.name == "debug") return // Prevents publishing debug library 

     def flavored = !variant.flavorName.isEmpty() 

     /** 
     * Translates "_" in flavor names to "-" for artifactIds, because "-" in flavor name is an 
     * illegal character, but is well used in artifactId names. 
     */ 
     def variantArtifactId = flavored ? variant.flavorName.replace('_', '-') : project.name 

     /** 
     * If the javadoc destinationDir wasn't changed per flavor, the libraryVariants would 
     * overwrite the javaDoc as all variants would write in the same directory 
     * before the last javadoc jar would have been built, which would cause the last javadoc 
     * jar to include classes from other flavors that it doesn't include. 
     * 
     * Yes, tricky. 
     * 
     * Note that "${buildDir}/docs/javadoc" is the default javadoc destinationDir. 
     */ 
     def javaDocDestDir = file("${buildDir}/docs/javadoc ${flavored ? variantArtifactId : ""}") 

     /** 
     * Includes 
     */ 
     def sourceDirs = variant.sourceSets.collect { 
      it.javaDirectories // Also includes kotlin sources if any. 
     } 
     def javadoc = task("${variant.name}Javadoc", type: Javadoc) { 
      description "Generates Javadoc for ${variant.name}." 
      source = variant.javaCompile.source // Yes, javaCompile is deprecated, 
      // but I didn't find any working alternative. Please, tweet @Louis_CAD if you find one. 
      destinationDir = javaDocDestDir 
      classpath += files(android.getBootClasspath().join(File.pathSeparator)) 
      classpath += files(configurations.compile) 
      options.links("http://docs.oracle.com/javase/7/docs/api/"); 
      options.links("http://d.android.com/reference/"); 
      exclude '**/BuildConfig.java' 
      exclude '**/R.java' 
      failOnError false 
     } 
     def javadocJar = task("${variant.name}JavadocJar", type: Jar, dependsOn: javadoc) { 
      description "Puts Javadoc for ${variant.name} in a jar." 
      classifier = 'javadoc' 
      from javadoc.destinationDir 
     } 
     def sourcesJar = task("${variant.name}SourcesJar", type: Jar) { 
      description "Puts sources for ${variant.name} in a jar." 
      from sourceDirs 
      classifier = 'sources' 
     } 

     def publicationName = "splitties${variant.name.capitalize()}Library" 
     publicationNames.add(publicationName) 

     "$publicationName"(MavenPublication) { 
      artifactId variantArtifactId 
      group groupId 
      version libraryVersion 

      artifact variant.outputs[0].packageLibrary // This is the aar library 
      artifact sourcesJar 
      artifact javadocJar 

      pom { 
       packaging 'aar' 
       withXml { 
        def root = asNode() 
        root.appendNode("name", 'Splitties') 
        root.appendNode("url", siteUrl) 
        root.children().last() + pomConfig 
        def depsNode = root["dependencies"][0] ?: root.appendNode("dependencies") 

        def addDep = { 
         if (it.group == null) return // Avoid empty dependency nodes 
         def dependencyNode = depsNode.appendNode('dependency') 
         dependencyNode.appendNode('groupId', it.group) 
         dependencyNode.appendNode('artifactId', it.name) 
         dependencyNode.appendNode('version', it.version) 
         if (it.hasProperty('optional') && it.optional) { 
          dependencyNode.appendNode('optional', 'true') 
         } 
        } 

        // Add deps that everyone has 
        configurations.compile.allDependencies.each addDep 
        // Add flavor specific deps 
        if (flavored) { 
         configurations["${variant.flavorName}Compile"].allDependencies.each addDep 
        } 
        // NOTE: This library doesn't use builtTypes specific dependencies, so no need to add them. 
       } 
      } 
     } 
    } 
} 

group = groupId 
version = libraryVersion 

afterEvaluate { 
    bintray { 
     user = bintray_user 
     key = bintray_api_key 
     publications = publicationNames 

     override = true 
     pkg { 
      repo = 'splitties' 
      name = project.name 
      desc = libraryDesc 
      websiteUrl = siteUrl 
      issueTrackerUrl = 'https://github.com/LouisCAD/Splitties/issues' 
      vcsUrl = gitUrl 
      licenses = ['Apache-2.0'] 
      labels = ['aar', 'android'] 
      publicDownloadNumbers = true 
      githubRepo = 'LouisCAD/Splitties' 
     } 
    } 
} 

Damit dies funktioniert, muss ich definiert die bintray_user und bintray_api_key Eigenschaften haben. Ich persönlich habe sie nur in meiner ~/.gradle/gradle.properties-Datei wie folgt:

bintray_user=my_bintray_user_name 
bintray_api_key=my_private_bintray_api_key 

Ich brauche auch folgende ext Eigenschaften ich in der publish.gradle Datei in meinem Stammprojekt build.gradle Datei verwendet, um zu definieren:

allprojects { 
    ... 
    ext { 
     ... 
     // Libraries 
     groupId = "xyz.louiscad.splitties" 
     libraryVersion = "1.2.1" 
     siteUrl = 'https://github.com/LouisCAD/Splitties' 
     gitUrl = 'https://github.com/LouisCAD/Splitties.git' 
    } 
} 

Und jetzt Ich kann es endlich in meinem Android-Bibliotheksmodul verwenden, wo ich mehrere productFlavors habe. Hier ist ein Ausschnitt aus einem veröffentlichbare Bibliothek Moduls build.gradle Datei:

plugins { 
    id "com.jfrog.bintray" version "1.7.3" // Enables publishing to bintray 
    id "com.github.dcendents.android-maven" version "1.5" // Allows aar in mavenPublications 
} 

apply plugin: 'com.android.library' 
apply plugin: 'maven-publish' // Used for mavenPublications 

android { 
    ... 
    defaultPublishConfig "myLibraryDebug" // Allows using this library in another 
    // module in this project without publishing to mavenLocal or Bintray. 
    // Useful for debug purposes, or for your library's sample app. 
    defaultConfig { 
     ... 
     versionName libraryVersion 
     ... 
    } 
    ... 
    productFlavors { 
     myLibrary 
     myLibrary_logged // Here, the "_" will be replaced "-" in artifactId when publishing. 
     myOtherLibraryFlavor 
    } 
    ... 
} 

dependencies { 
    ... 
    // Timber, a log utility. 
    myLibrary_loggedCompile "com.jakewharton.timber:timber:${timberVersion}"; // Just an example 
} 
... 

ext { 
    libraryDesc = "Delegates for kotlin on android that check UI thread" 
} 

apply from: '../publish.gradle' // Makes this library publishable 

Wenn Sie alle diese korrekt eingerichtet haben, mit dem Namen Ihrer Bibliothek statt mine's (die Sie als Beispiel verwenden können), können Sie versuchen Publishing eine Version Ihrer aromatisierten Bibliothek, indem Sie zuerst versuchen, sie in mavenLocal zu veröffentlichen. Um dies zu tun, führen Sie diesen Befehl:

myLibrary $ ../gradlew publishToMavenLocal 

können Sie dann versuchen mavenLocal in Ihrer App-Repositories Hinzufügen (example here) und Ihre Bibliothek als Abhängigkeit hinzugefügt (artifactId der Geschmack Name sein sollte, mit „_“ ersetzt durch " - ") und es zu bauen. Sie können auch mit Ihrem Datei-Explorer (verwenden Sie cmd + Shift + G auf Mac im Finder, um auf versteckte Ordner zugreifen) das Verzeichnis ~/.m2 und suchen Sie nach Ihrer Bibliothek.

Wenn es Zeit ist zu veröffentlichen, um bintray/jcenter, Sie müssen nur diesen Befehl ausführen:

myLibrary $ ../gradlew bintrayUpload 

Wichtig:

Bevor Sie Ihre Bibliothek mavenLocal, Bintray oder eine andere Maven-Repository veröffentlichen Normalerweise möchten Sie Ihre Bibliothek gegen eine Beispielanwendung testen, die die Bibliothek verwendet. Diese Beispielanwendung, die ein anderes Modul im selben Projekt sein sollte, muss nur die Projektabhängigkeit haben, die wie folgt aussehen sollte: compile project(':myLibrary'). Da Ihre Bibliothek jedoch mehrere productFlavors enthält, sollten Sie alle testen.Leider ist es derzeit nicht möglich, die Konfiguration anzugeben, die Sie in der build.gradle Datei Ihrer Beispielanwendung verwenden möchten (es sei denn, Sie verwenden publishNonDefault true in der Datei build.gradle Ihrer Bibliothek, wodurch maven- und bintray-Publikationen unterbrochen werden). Sie können jedoch die Standardkonfiguration (dh buildVariant) angeben. in Ihrem Bibliotheksmodul als solches: defaultPublishConfig "myLibraryDebug" in der android Schließung. Sie können die verfügbaren Build-Varianten für Ihre Bibliothek im Tool "Build Variants" in Android Studio sehen.

Fühlen Sie sich frei zu erkunden my library "Splitties" here, wenn Sie ein Beispiel benötigen. Das aromatisierte Modul heißt concurrency, aber ich verwende mein Skript auch für nicht verfeinerte Bibliotheksmodule, und ich habe es gründlich auf allen Bibliotheksmodulen in meinem Projekt getestet.

Sie können mich erreichen, wenn Sie Hilfe benötigen, um es für Sie einzurichten.

+0

als Notiz über den unteren Abschnitt veröffentlichen müssen, können Sie die konsumierende Anwendung an die richtige Konfiguration anpassen, indem Sie die missingDimensionStrategy wie die 'missingDimensionStrategy'-Marke angeben ',' XXX ' missingDimensionStrategy' Umgebung ',' ZZZ'' – MrTristan

3

ich es nicht versucht, damit ich die Antwort gelöscht werden, wenn es doesn Das Problem nicht lösen.

Sie sollten für jeden Geschmack ein anderes Artefakt (oder Build-Variante, wenn Sie bevorzugen).
Auf diese Weise werden Sie in jcenter x Artefakte haben, jeder von ihnen mit einer Pom-Datei.

Etwas wie:

groupId 
|--library-full 
|----.pom 
|----.aar 
|--library-light 
|----.pom 
|----.aar 

In Ihrer Top-Level-Datei, die Sie

allprojects { 
    repositories { 
     jcenter() 
    } 

    project.ext { 
     groupId="xxx" 
     libraryName = "" 
     ...... 
    } 
} 

Dann in Ihrer Bibliothek Modul definieren:

productFlavors { 
     full { 
      project.ext.set("libraryName", "library-full"); 
     } 
     light { 
      project.ext.set("libraryName", "library-light"); 
     } 
} 

bintray { 

    //... 
    pkg { 
     //...Do the same for other variables 
     name = project.ext.libraryName 
    } 
} 

Schließlich stellen Sie sicher, nur die Freigabe veröffentlichen Build-Typ (warum auch die Debug-Version?)

+0

ok, damit kann ich die verschiedenen Geschmacksrichtungen auf verschiedene bintray-Pakete hochladen. Aber der Klassifikator ist immer noch da und jedes Paket hat den ganzen Geschmack. –

+0

Sorry, aber ich weiß nicht, was Sie mit Klassifikator beziehen. Ich überprüfe die Pom-Datei im jcenter und Sie sollten groupId/artifactId haben, um eine Bibliothek zu identifizieren. –

+0

ja, ich habe das aber ich habe den Klassifikator auch hier, also habe ich sowohl 'androidsdk-0.0.4-lightDebug.aar' als auch' androidsdk-0.0.4-lightDebug.aar' auf jedem Paket. Also gibt es derzeit zwei Probleme damit. Der Klassifikator ist zum Beispiel 'lightDebug'. –

1

Es klingt, als ob Sie den Klassifizierer im Dateinamen nicht möchten. Es sieht so aus, als ob der Klassifizierer mit dem Namen der generierten Bibliothek übereinstimmt. Haben Sie versucht, ihnen den gleichen Dateinamen zu geben, aber sie in separaten Verzeichnissen auszugeben? Zum Beispiel im Android -umfang:

libraryVariants.all { variant -> 
    variant.outputs.each { output -> 
     def outputFile = output.outputFile 
     if (outputFile != null && outputFile.name.endsWith('.aar')) { 
      def fileName = "same_name-${version}.aar" 
      output.outputFile = new File(outputFile.parent+"/${archivesBaseName}", fileName) 
     } 
    } 
} 
+0

, die es mir erlauben, den Dateinamen der .aar - Datei zu ändern (von 'build/outputs/aar/androidsdk /', aber nicht von dem vom bintray - Plugin, also half es nicht. –

2

Wenn jemand noch mit diesem Problem hier steckt ist, was für mich gearbeitet -

Angenommen, Sie haben die Release-Build veröffentlichen möchten für Ihre flavour1 diese build.gradle

zu Ihrer hinzufügen
android { 
    ... 
    defaultPublishConfig "flavour1Release" 
} 

Entfernen Sie publishNonDefault true, wenn es in Ihrer GRADLE-Datei vorhanden ist.

Fügen Sie diese innerhalb des bintray Block wie diese

bintray { 
    ... 
    archivesBaseName = 'YOUR_ARTIFACT_ID' 
    ... 
} 

Dann starten Sie einfach die bintrayUpload Aufgabe, wie Sie es.

Die defaultPublishConfig muss jedes Mal geändert werden, wenn Sie eine neue Geschmacksrichtung veröffentlichen müssen.

+0

Das Entfernen von 'publishNonDefault true' verhindert das Modul in anderen Modul in Debug verwendet werden, ist es eine gute Idee, aber löst das Problem nicht vollständig –

+0

Ja, wenn Sie das Bibliotheksmodul in debug verwenden möchten, müssen Sie etwas wie 'defaultPublishConfig" flavour1Debug "' Wechseln Sie zu 'defaultPublishConfig" flavour1Release "' nur wenn Sie in bintray – k1slay

5

Das Setup:

buildTypes { 
    debug { 
    } 
    release { 
    } 
} 

publishNonDefault true 

Das Update:

defaultPublishConfig 'release' 

// Fix for defaultPublishConfig not working as expected 
// ref: https://github.com/dcendents/android-maven-gradle-plugin/issues/11 
libraryVariants.all { variant -> 
    if(publishNonDefault && variant.name == defaultPublishConfig) { 
    def bundleTask = tasks["bundle${variant.name.capitalize()}"] 
    artifacts { 
     archives(bundleTask.archivePath) { 
     classifier null //necessary to get rid of the suffix in the artifact 
     builtBy bundleTask 
     name name.replace('-' + variant.name, '')//necessary to get rid of the suffix from the folder name 
     } 
    } 
    } 
} 

Dieses Update wird nach wie vor alle Artefakte veröffentlichen, aber es wird ein Standard-Artefakt ohne den Geschmack Suffix veröffentlichen, die genug ist, um es funktioniert alles.

Das Update nur den Standard-Artefakt zu laden wäre dies (wenn das bintray Plugin wußte, was POM-Filter sind):

install { 
    repositories.mavenInstaller { 
    /* 
    POM filters can be used to block artifacts from certain build variants. 

    However, Bintray does not respect POM filters, therefore this only works for maven deploy plugin. 
    Also, bintray crashes with named filters, since it always expects a /build/pom/pom-default.xml, 
    which does not happen with named filters. 
    */ 
    filter { artifact, file -> 
     // this how the default classifier is identified in case the defaultPublishConfig fix is applied 
     artifact.attributes.classifier == null 
    } 
    } 
}