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.
Sie haben jeden Geschmack als ein anderes Artefakt zu aktualisieren. –
@GabrieleMariotti Wie können Sie den Geschmack in den bintray 'Konfigurationen' spezifizieren? –
Ich habe es vorher nicht versucht. Sie müssen jedoch einen Teil der bintray-Konfigurationen im Aromablock angeben, um den Artefaktnamen zuzuordnen. –