Я столкнулся с той же проблемой, и вот лучшее, что я мог сделать:
Используя mavenPublications
и плагин gradle maven-publish
вместе с плагином bintray, вы можете опубликовать любой вариант в mavenLocal и bintray.
Вот файл publish.gradle
, который я применяю в конце всех библиотечных модулей моего проекта. Я хочу опубликовать:
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'
}
}
}
Чтобы это работало, мне нужно определить свойства bintray_user
и bintray_api_key
. Лично у меня они просто есть в моем ~/.gradle/gradle.properties
файле вот так:
bintray_user=my_bintray_user_name
bintray_api_key=my_private_bintray_api_key
Мне также нужно определить следующие свойства ext, которые я использовал в файле publish.gradle
. в файле build.gradle
моего корневого проекта:
allprojects {
...
ext {
...
// Libraries
groupId = "xyz.louiscad.splitties"
libraryVersion = "1.2.1"
siteUrl = 'https://github.com/LouisCAD/Splitties'
gitUrl = 'https://github.com/LouisCAD/Splitties.git'
}
}
И теперь я наконец-то могу использовать его в своем модуле библиотеки Android, где у меня есть несколько файлов productFlavors
. Вот фрагмент из файла build.gradle
модуля библиотеки для публикации:
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
Когда у вас все это настроено правильно, с именем вашей библиотеки вместо моей (которое вы можете использовать например), вы можете попробовать опубликовать версию своей расширенной библиотеки, попытавшись сначала опубликовать ее в mavenLocal. Для этого выполните эту команду:
myLibrary $ ../gradlew publishToMavenLocal
Затем вы можете попробовать добавить mavenLocal
в репозиторий вашего приложения (пример здесь) и попробуйте добавить свою библиотеку в качестве зависимости (artifactId должен быть именем разновидности, где «_» заменено на «-») и собрать ее. Вы также можете проверить в проводнике (используйте cmd+shift+G на Mac в Finder для доступа к скрытой папке) каталог ~/.m2
и найти свою библиотеку.
Когда пришло время опубликовать в bintray/jcenter, вам просто нужно запустить эту команду:
myLibrary $ ../gradlew bintrayUpload
Важно:
Прежде чем опубликовать свою библиотеку в mavenLocal, Bintray или другом репозитории maven, вы обычно захотите протестировать свою библиотеку на образце приложения, которое использует библиотеку. Этот образец приложения, который должен быть еще одним модулем в том же проекте, просто должен иметь зависимость от проекта, которая должна выглядеть так: compile project(':myLibrary')
. Однако, поскольку в вашей библиотеке есть несколько productFlavors, вы захотите протестировать их все. К сожалению, в настоящее время невозможно указать, какую конфигурацию вы хотите использовать из файла build.gradle
вашего примера приложения (если только вы не используете publishNonDefault true
в файле build.gradle
вашей библиотеки, что нарушает публикации maven и bintray), но вы можете указать конфигурацию по умолчанию (т.е. buildVariant) в модуле вашей библиотеки как таковой: defaultPublishConfig "myLibraryDebug"
в замыкании android
. Вы можете увидеть доступные варианты сборки для вашей библиотеки в инструменте «Варианты сборки» Windows в Android Studio.
Не стесняйтесь исследовать мою библиотеку "Splitties" здесь, если вам нужен пример. Ароматизированный модуль называется concurrency
, но я использую свой скрипт и для неароматизированных библиотечных модулей, и я тщательно протестировал его на всех библиотечных модулях в моем проекте.
Вы можете связаться со мной, если вам нужна помощь в настройке.
person
Louis CAD
schedule
27.01.2017
configurations
? - person Hugo Gresse   schedule 17.12.2015