发布Android库(aar)与Bintrayselect的风味

我已经为我的项目添加了一些flavors (或者如果你想要的话)。

事实是,当我发布图书馆到bintray ,所有口味上传(这是伟大的),但我无法使用它们。 这里使用的插件是官方的插件。

上传的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 

如您所述, fullRelease被命名为classifier ,请参阅文档第23.4.1.3节 。

我正在寻找一个解决scheme来select我想要上传的口味。

我已经看过bintray的例子( 这里和这里 ),还有其他的例子,但我仍然坚持。

这是我目前的脚本:

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

要导入库,我正在使用这个:

 compile ('com.example.lib:sdk:0.0.8:fullRelease@aar') { transitive = true; } 

Solutions Collecting From Web of "发布Android库(aar)与Bintrayselect的风味"

我面临同样的挑战,这里是我可以做的最好的:

沿着bintray插件使用mavenPublications和gradle maven-publish插件,你可以发布任何变种到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 'louis.cognault@gmail.com' } } 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_userbintray_api_key属性。 我个人只是把他们放在我的~/.gradle/gradle.properties文件中,像这样:

 bintray_user=my_bintray_user_name bintray_api_key=my_private_bintray_api_key 

我还需要在我的根项目的build.gradle文件的publish.gradle文件中定义以下ext属性:

 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应该是味道的名称,“_”replace为“ – ”)并构build它。 您也可以使用文件资源pipe理器(在Finder的Mac上使用cmd + shift + G来访问隐藏文件夹)目录~/.m2并查找您的库。

当发布到bintray / jcenter时,您只需运行以下命令:

 myLibrary $ ../gradlew bintrayUpload 

重要:

在将库发布到mavenLocal,Bintray或其他Maven仓库之前,通常需要针对使用该库的示例应用程序尝试使用库。 这个示例应用程序应该是同一个项目中的另一个模块,只需要具有项目依赖项,应该看起来像这样: compile project(':myLibrary') 。 但是,由于您的图书馆有多个productFlavors,因此您需要testing所有这些。 不幸的是,目前不可能从示例应用程序的build.gradle文件中指定要使用哪种configuration(除非在库的build.gradle文件中使用publishNonDefault true ,这会打破maven和bintray出版物),但是您可以指定默认值在你的库模块中的configuration(即buildVariant)如下: android闭包中的defaultPublishConfig "myLibraryDebug" 。 您可以在Android Studio的“Build Variants”工具窗口中查看库的可用构build变体。

如果您需要示例,请随时在此探索我的图书馆“分享” 。 有味的模块被命名为concurrency ,但我也使用我的脚本的无味的库模块,我在我的项目中的所有库模块通过testing。

如果您需要帮助为您设置,您可以联系我。

设置:

 buildTypes { debug { } release { } } publishNonDefault true 

修正:

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

此修复程序仍将发布所有工件,但它将发布不带风格后缀的默认工件,这足以使其全部工作。

修正只上传默认的神器将是(如果bintray插件知道什么POMfilter):

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

我没有尝试,所以我会删除答案,如果它不能解决问题。

您应该为每种风味发布不同的工件(或者如果您愿意,可以构build变体)。
通过这种方式,您将拥有j个x文件,每个文件都有一个pom文件。

就像是:

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

在您的顶级文件中,您可以定义

 allprojects { repositories { jcenter() } project.ext { groupId="xxx" libraryName = "" ...... } } 

然后在你的库模块中:

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

最后确保只发布发布版本types(为什么还要debugging版本?)

如果有人仍然坚持这个问题,这是什么对我有用 –

比方说,你想发布你的flavour1的发布版本添加到你的build.gradle

 android { ... defaultPublishConfig "flavour1Release" } 

如果publishNonDefault true存在于您的Gradle文件中,请将其移除publishNonDefault true

像这样在bintray块内添加这个

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

然后就像你那样运行bintrayUpload任务。

每当你需要发布一个新的风格时, defaultPublishConfig将不得不被改变。

这听起来像你不希望分类器在文件名。 看起来分类器与生成的库文件名相同。 你有尝试给他​​们相同的文件名,但输出到不同的目录? 例如在android范围内:

 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) } } }